![]() |
Falsche Ausgabe von Floatwerten
Moin,
teste gerade die Taylorreihe von Pi. nach Term 28 (step) gibt es keine neuen Werte. Was mache ich falsch? [Edit] Ausgabe formatieren ? [/Edit] Gruß Wolfgang
Delphi-Quellcode:
function my_pi(steps:integer):double;
Var i:integer; s,ds:double; Begin s:=1; for i:=1 to steps do begin ds:=power(-1,i)/((2*i+1)* power(3,i)); s:=s+ds; end; result:=6/sqrt(3)*s; End; procedure TForm1.Button1Click(Sender: TObject); var steps:integer; begin steps:=StrToInt(SpinEdit1.Text); Edit1.Text:=FloatToStr(my_pi(steps)); end; |
Re: Falsche Ausgabe von Floatwerten
Kann es sein, dass der double-Typ zu ungenau für weitere Steps ist? Immerhin liefert das hier:
Delphi-Quellcode:
ja (betragsmäßig) sehr, sehr kleine Werte für große i. Am Endergebnis ändert sich also irgendwann nichts mehr [edit], weil ds praktisch 0 wird. [/edit]
ds:=power(-1,i)/((2*i+1)* power(3,i));
Patti |
Re: Falsche Ausgabe von Floatwerten
Der Windowsrechner liefert ja erheblich mehr Nachkommastellen
|
Re: Falsche Ausgabe von Floatwerten
Bei i=28 steht unter deinem Bruchstrich 1.303.977.169.932.777. 16 Stellen ist schon nahe an der Grenze dessen was ein Double noch genau darstellen kann. Du rennst hier in der Tat in das offene Messer der Floats: Ungenauigkeit bei extrem kleinen und großen Werten. Einzige Lösung hierzu: Die Rechnung so umstellen, dass keine so extremen Zwischenergebnisse mehr vorkommen, oder eine BigNum-Unit verwenden.
Edit: Der Windows Taschenrechner benutzt imho eine Art von BigNum Implementierung. Edit2: Ich seh grad dass du ja auch noch aufsummierst. Da ist definitiv das Ende der Fahnenstange. Aber sowas von! Edit3: Okay, nicht die großen Werte, aber auch bei den sehr kleinen tritt das Problem ähnlich auf, nur eben auf der "anderen Seite" vom Komma. Ab einem gewissen Punkt addierst du im Wesentlichen Nullen, und auch das Weiterrechnen mit 6/sqrt(3)*s tut nicht beonders gut. Jede weitere Operationen auf grenzwertigen Werten macht das Ergebnis nur noch ungenauer. |
Re: Falsche Ausgabe von Floatwerten
In der DP gibt es mehrere MatheLibs, die mit "extremen Zahlen" umgehen können. Evtl. kann man mit diesen ein genaueres Ergebnis erzielen. Für i = 28 liefert die Zeile, die ich oben zitiert hab folgenden Wert für ds: 7,66884592045082*10^(-16), also einen verdammt kleinen Wert. Das ist immerhin eine Zahl mit 15 (!) Nullen nach dem Komma, bis die erste Nicht-Null kommt! Das bedeutet aber auch, dass sich an dem Endergebnis nicht mehr viel ändert, egal wie oft du das ganze machst. Was kommt denn bis jetzt als Näherungswert für Pi raus?
Patti |
Re: Falsche Ausgabe von Floatwerten
Danke für die Antworten, jetzt komme ich weiter :)
|
Re: Falsche Ausgabe von Floatwerten
@patti:
3,14159265358979 [Edit] Das ist gerade 'mal ein bißchen besser als mein Taschenrechner von Aldi für3,99 Euronen hergibt [/Edit] |
Re: Falsche Ausgabe von Floatwerten
Zitat:
Code:
Nach einpaar Nachkommastellen wird es also für die Praxis uninteressant :-D
40204,8 (3,141)
40211,2 (3,1415) 40212,352 (3,14159) 40212,3776 (3,141592) 40212,3859659494 (3,14159265358979) <-- dein Wert 40212,3859659494 (3,141592653589793238462643383279502884197169399) <-- 45 Stellen n. d. Komma Patti |
Re: Falsche Ausgabe von Floatwerten
Zitat:
Wie willst Du zB sin/cos für große Werte ausrechnen, wenn Du Pi oder 2/Pi nicht auf ausreichend viele Stellen kennst? Für den vollen extended-Bereich braucht man ca 16000 Bits von 2/Pi! Gruß Gammatester |
Re: Falsche Ausgabe von Floatwerten
Zitat:
MFG Patti |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz