2016-03-29 28 views
2

Es gibt eine interessante Frage auf Facebook, die ich begegnete. Er bittet darum, dass er mit MATLAB R2014a (64-Bit-Version) und den Code lautete: -Warum fix ((20.45-20) * 60) ist nicht gleich mit fix ((20) * 60) in MATLAB

x = 0.45; 
min = fix((x)*60); 
fprintf('min = %d \n', min); 

x = 20.45 
min = fix((x-20)*60); 
fprintf('min = %d \n', min); 

Die Ergebnisse sind folgende:

>> tx 
min = 27 
min = 26 

die wegen falsch sind (20,45-20) geben sollte das gleiche Ergebnis wie 0,45, aber es nicht.

Er versuchte auch% f, aber es ergab immer noch das gleiche Ergebnis.

Zuerst dachte ich, es wäre ein Problem mit der Speicherung von Fließkomma, aber nachdem ich es berechnet habe, schien es nicht die richtige Antwort zu sein.

Also, ich denke diese Frage ist interessant und herausfordernd. Könnte mir bitte jemand helfen, zu erklären, wie das passiert?

Where the answers are not equal.

Dank!

+3

Ja, es ist ein Fehler beim Speichern von Fließkommawerten. '0.45' ist nicht' 20.45-20' –

+2

Nützliche Vorlesung: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – liori

+5

Das nächste Doppel zu 0,45 ist 0.45000000000000000011102230246251565404236316680908203125, etwas größer als genau . Das nächstliegende Doppel zu 20.45 ist 20.449999999999999289457264239899814128875732421875, etwas kleiner als exakt. 20.45-20 ergibt 0.449999999999999289457264239899814128875732421875 –

Antwort

2

Das Problem, das Sie sehen werden, ist mit der Speicherung von Gleitkommazahlen finden Sie unter:

20.45-20==0.45 

Wenn Sie die Berechnung in Ihrem Kopf zu tun kommt es die gleiche, aber in dem Computer ist es nicht zu sehen this question for more details