Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Falsche Ausgabe von Floatwerten (https://www.delphipraxis.net/144124-falsche-ausgabe-von-floatwerten.html)

Wolfgang Mix 30. Nov 2009 18:56


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;

patti 30. Nov 2009 19:01

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:
ds:=power(-1,i)/((2*i+1)* power(3,i));
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]

Patti

Wolfgang Mix 30. Nov 2009 19:06

Re: Falsche Ausgabe von Floatwerten
 
Der Windowsrechner liefert ja erheblich mehr Nachkommastellen

Medium 30. Nov 2009 19:08

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.

patti 30. Nov 2009 19:12

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

Wolfgang Mix 30. Nov 2009 19:35

Re: Falsche Ausgabe von Floatwerten
 
Danke für die Antworten, jetzt komme ich weiter :)

Wolfgang Mix 30. Nov 2009 20:07

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]

patti 3. Dez 2009 16:29

Re: Falsche Ausgabe von Floatwerten
 
Zitat:

Zitat von Wolfgang Mix
@patti:
3,14159265358979

[Edit] Das ist gerade 'mal ein bißchen besser als mein Taschenrechner von Aldi
für3,99 Euronen hergibt [/Edit]

Der Taschenrechner hat die Zahl Pi mit Sicherheit aber als Konstante definiert. Wenn du vorhast, mit Pi weiterzurechnen, wirst du beliebig viele Stellen im Internet finden, das Ergebnis wird dann beliebig genau. Für die Praxis ist das aber gar nicht nötig. Du kannst selbst mit den 14 Nach-Kommastellen, die du herausgefunden hast, den Umfang der Erde (bei einem Erd-Radius von 6400 km !) auf weit weniger als einen Millimeter (!) genau bestimmen:

Code:
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
Nach einpaar Nachkommastellen wird es also für die Praxis uninteressant :-D

Patti

gammatester 3. Dez 2009 17:26

Re: Falsche Ausgabe von Floatwerten
 
Zitat:

Zitat von patti
...
Nach einpaar Nachkommastellen wird es also für die Praxis uninteressant :-D
Patti

Und damit machst Du genau einen ähnlichen Fehler wie BICE (Borland, Inprise, Codegier, Embadingens)!!

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

patti 3. Dez 2009 18:28

Re: Falsche Ausgabe von Floatwerten
 
Zitat:

Zitat von gammatester
Wie willst Du zB sin/cos für große Werte ausrechnen, wenn Du Pi oder 2/Pi nicht auf ausreichend viele Stellen kennst?

Es mag sein, dass ich dafür genauere Werte für Pi brauche. Es ging mir aber eigentlich darum, zu zeigen, dass für einfache Berechnungen von Flächen, Volumen, etc. einpaar Nachkommastellen von Pi absolut ausreichen, um ein vernünftiges Ergebnis zu bekommen. Die nötige Genauigkeit hängt natürlich davon ab, was ich damit vorhabe.

MFG
Patti


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz