Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#28

AW: Single wert ist unterschiedlich obwohl gleich

  Alt 18. Jun 2018, 16:39
Es gibt auch viele die mitlesen. Und wenn du schreibst, dass das direkte Vergleichen zweier Gleitkommazahlen kein Problem ist, dann führst du diese Leute auf's Glatteis.
Inwischen habe ich die neuen Versionen von AMath/DAMath und MPArith hochgeladen und deshalb wieder etwas mehr Zeit. Vielleicht sollten wir allerdings einen eigenen Thread aufmachen oder ein Moderator splittet diesen.

Ich will niemanden auf Glatteis führen, und jeder mag iszero/samevalue benutzen. Nur bitte: der direkte Vergleich kann gar kein Problem sein, weil iszero/samevalue genau solche macht:
Delphi-Quellcode:
  if Epsilon = 0 then
    Epsilon := ExtendedResolution;
  Result := Abs(A) <= Epsilon;
Wie man sieht, zwei direkte Vergleiche. Ich sage nur, daß jeder das auch flexibler und angemessener direkt machen kann.

Zu Deinem Bespiel sqr(sqrt(2)) <> 2 und Luckies 69.82 <> 69.2 + 0.62. Das Problem ist wieder einmal die nicht exakte Darstellbarkeit, hier von sqrt(2) und allen Luckischen Zahlen (und ein C-Compiler-Problem?)

Was man sich merken sollte.
  • Nicht jede reelle Zahl ist exakt als Fließkommazahl f*2^x darstellbar mit 0 < f < 2^p und x innerhalb gewisser Grenzen.
  • Jede Fließkommazahl ist genau definiert. Ein reelle Zahl wird durch Rundung auf eine FKZ abgebildet.
  • Die Grundoperation verarbeiten die exakten FPZ wie mit unendlicher Genaugkeit und anschließender Rundung.
  • Dabei werden naturgemäß Rundungsfehler gemacht, die genau abgeschätzt werden können.
Hier Luckies float-Zahlen, d.h. single
Code:
69.2   -> 69.1999969482421875
0.62   -> 0.62000000476837158203125
69.82  -> 69.81999969482421875
Addiert man nun die beide exakten Singles, so erhält man 69.1999969482421875 + 0.62000000476837158203125 = 69.81999695301055908203125. Das wird nun zum nächsten Single gerundet und ergibt 69.81999969482421875 was genau dem Single-Wert von 69.82 entspricht.

Ich weiß, zwar nicht was für einen C-Compiler er benutzt hat, aber alle Delphi/Freepascal-Versionen liefern true als Ausgabe von
Delphi-Quellcode:
{$apptype console}
var
  a,b,c,d: single;
begin
  a := 69.2;
  b := 0.62;
  c := a + b;
  d := 69.82;
  writeln(c=d);
end.
@Luckie
Danke! Ich wusste noch so ungefähr, dass es da so ein Problem gab.
Gut, das mal aufzufrischen.
Ja, offensichtlich der C-Compiler.

Geändert von gammatester (18. Jun 2018 um 16:48 Uhr)
  Mit Zitat antworten Zitat