Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Gleitpunktarithmetik - Diskrepanzen (https://www.delphipraxis.net/59179-gleitpunktarithmetik-diskrepanzen.html)

mumu 18. Dez 2005 22:21


Gleitpunktarithmetik - Diskrepanzen
 
warum erhalte ich für folgende x und y werte (x = 1.5e30 und y = 2e10) solche unterschiedliche werte, obwohl die gleichungen eigentlich äquivalent sein sollten.
a) result = x * y + (3-x) * y - y;
= -2.0E10
b) result = 2 * y;
= 4.0E10

gruß

dizzy 19. Dez 2005 02:38

Re: Gleitpunktarithmetik - Diskrepanzen
 
Das Problem lässt sich auf folgenden Teilterm verkürzen, in dem falsch gerechnet wird: (3-x)


Und da ist es ein Problem der Genauigkeit denke ich. x hat 31 Stellen, aber selbst Extended ist nur auf bis zu 20 Stellen genau. Somit wird intern durch Rundung aus (3-x) einfach (-x), da die 3 viel zu klein ist, um das Ergebnis signifikant zu ändern. Sie stünde nämlich weit hinter der 20. Stelle die maximal noch genau wäre.
Und diese Kleinigkeit führt zu deinem Phänomen. Kleine Ursache, extreme Wirkung :D. Ein hervorragendes Beispiel dafür, warum es sich fast immer lohnt Terme so weit wie möglich zu vereinfachen in der Informatik ;)


Gruss,
Fabian

mumu 19. Dez 2005 06:34

Re: Gleitpunktarithmetik - Diskrepanzen
 
ja genau das hab ich mir eigentlich auch gedacht, dass die 3 so klein ist, dass sie in dem zwischenterm 3-x nicht ins gewicht fällt und bei der genauigkeit nicht mit einbezogen werden kann.

ich habe die aufgabe aus dem studium und bei der aufgabe steht folgendes dabei:
wie erklärt sich die auftretende diskrepanz zwischen den beiden ergebnissen, obwohl x und y und sämtliche zwischenergebnisse hier noch weit innerhalb der double genauigkeit liegen?????

hä?? das versteh ich jetzt halt wieder net? 3-x kann ja für x = 1.5e30 eben nicht durch die Anzahl der Stellen beim Double format repräsentiert werden und muss deshalb gerundet werden.

oder?

alzaimar 19. Dez 2005 06:49

Re: Gleitpunktarithmetik - Diskrepanzen
 
Rechne doch einfach mal mit der Annahme, das (3-x) = -x ist (bei Extended, wohlgemerkt).
Code:
result = x * y + (3-x) * y - y;
result = x * y + ( -x) * y - y;
result = x * y -    x * y - y;
result =                  - y;
q.e.d

mumu 19. Dez 2005 08:32

Re: Gleitpunktarithmetik - Diskrepanzen
 
stimmt alzaimar, das macht sinn.

mich würde jedoch trotzdem interessieren, wie ist die fragestellung zu verstehen ist? was hat sich der prof dabei gedacht?
Zitat:

wie erklärt sich die auftretende diskrepanz zwischen den beiden ergebnissen, obwohl x und y und sämtliche zwischenergebnisse hier noch weit innerhalb der double genauigkeit liegen?????

dizzy 19. Dez 2005 09:53

Re: Gleitpunktarithmetik - Diskrepanzen
 
Die Fragestellung zeugt meiner Meinung nach von Unsauberkeit des Profs. Die Zwischenergebnisse liegen bei weitem eben nicht im Genaugkeitsbereich von Double. Die konstanten Werte von x und y tun dies, aber nicht (3-x)! Da hat der gute wohl böse gepatzt :roll:

mumu 19. Dez 2005 12:35

Re: Gleitpunktarithmetik - Diskrepanzen
 
jo dizzy scheint mir irgendwie auch so, durch den satz, dass zwischenergebnisse im bereich von double liegen wird ja im endeffekt die ganze aufgabe unsinnig...

oder kann es noch nen anderen grund für die ergebnisse von oben geben?

mumu 19. Dez 2005 13:37

Re: Gleitpunktarithmetik - Diskrepanzen
 
naja gut, oder er hat gemeint, dass die zwischenergebnisse im genauigkeitsbereich von double liegen, da sie ja gerundet werden :-)

das wär aber auch leicht hohl?! :-)

alzaimar 19. Dez 2005 14:15

Re: Gleitpunktarithmetik - Diskrepanzen
 
Nee, stimmt nicht. Oder doch. äh... :gruebel:

Er meint den Wertebereich, schreibt aber etwas über Genauigkeit. Schon pervers. :stupid:
Viel hübscher ist das hier (würde ich ihm als Friedensangebot überreichen):
Delphi-Quellcode:
Var
  x : Extended;

begin
  x:=-0.3;
  while x<0.2 do begin
    if x=0 then
      memo.lines.add('[:-)')
    else
      memo.Lines.Add(FloatToStr(x));
    x := x+0.1;
    End;
end;
Frage: Erscheint der/das/die Smiley?
Wenn ja, warum?
Und wenn nein: Verdammt, warum nicht?

Hier liegt Alles im grünen Bereich, sämtliche Zwischenergebnisse, Startwerte etc.
Oder vielleicht doch nicht?

mumu 19. Dez 2005 14:33

Re: Gleitpunktarithmetik - Diskrepanzen
 
stimmt, er mein höchstwahrscheinlich den wertebereich :-)

hmm kann schon sein, dass der Smilie nicht angezeigt wird. evtl wird ja der wert nicht 100%ig auf null gerundet, oder so, keine ahnung?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 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