2016-09-22 4 views
-2

Heute machte ich meine Universität Programmierung Übungen und kam zu dieser seltsamen Sache. Ich würde gerne wissen, ob mir irgendjemand erklären könnte, was hier vor sich geht.Wirklich seltsame Interaktion mit Zahlen

Das ist das, was ich es zu zeigen, codiert:

program problema; 

var 

a : real; 
b : real; 

begin 

a := 1 - 0.8 - 0.2; 
b := 1 - 0.2 - 0.8; 

write(a); 
writeln(b); 

end. 

Während ich es erwartet 0 in beiden Fällen zurück, es -1,3 tatsächlich gibt ... auf dem ersten und 0 auf dem zweiten . Wie kann das möglich sein?

+5

Mögliche Duplikate von [Ist Fließkomma-Mathematik gebrochen?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – JJJ

+0

Beachten Sie, dass es nicht -1,3 ... aber -1,3 ist ... E-020, das ist -0.000 ... 13 (mit 20 Nullen). – JJJ

+0

Es bewertet -5.55111512313e-17 in PHP und auf meinem Fedora Desktop-Rechner. Es ist also ein weites Symptom der Computermathematik, nicht nur Pascal. :) Sehen Sie diesen für Referenz auf das genaue Problem: http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F – SomeDude

Antwort

0

Sie sehen rundliche Fehler beim Umgang mit Dezimalzahlen, die in binär ausgedrückt werden. Die anderen Kommentatoren haben dies zwar angedeutet, aber nicht ausdrücklich gesagt.

Um damit umzugehen, ist es wichtig, die Gleichheit als einen Bereich und nicht als eine Gleichheit zu betrachten. Um beispielsweise zu entscheiden, ob eine reelle Zahl x gleich 0,2 ist, teste es nicht als x = 0,2, sondern für | x-0,2 | < Epsilon, wo Epsilon ist die Toleranz, die Sie wollen. Vielleicht ist abs (x-0.2) < 0.000001 gut genug.