Es ist kein Matlab-Problem; Es ist ein Gleitkomma-Problem. Sie erhalten das gleiche Ergebnis in C ++ (oder einer anderen Programmiersprache, die IEEE754 entspricht) :
%Vor%Ausgabe:
%Vor%Dies liegt daran, dass 1.1 und 0.9 nicht exakt in Binärdateien dargestellt werden können . Es ist wie 1/3 in Dezimal ausgedrückt: Sie müssen
schreiben %Vor%und unbegrenzt fortfahren. Aber egal wie lange Sie weitermachen, Sie werden es nie richtig machen.
In Fließkommazahl haben Sie nur so viele Stellen, die Sie speichern können, also muss die Berechnung irgendwo anhalten. Das Ergebnis der Berechnung ist tatsächlich
%Vor%Das ist ziemlich nah, aber nicht ganz korrekt.
Aus diesem Grund sollten Sie immer zweimal nachdenken, bevor Sie ==
verwenden, um zwei Fließkommazahlen zu vergleichen. Es ist selten, dass der Operator ==
ohne einige "seltsame" Konsequenzen wie die gerade aufgetretene angewendet werden kann.
Es ist besser, eine runde spezifische Toleranz wie
zu verwenden %Vor% wobei eps
eine Matlab-Funktion ist, die den Abstand zwischen Doppelpunkten für einen bestimmten Wert zurückgibt doppelter Wert. Aber wirklich, das ist keine All-Over-All-Lösung; Fliesspunkte korrekt zu vergleichen, ist ein schwieriges Geschäft.
Blättern Sie zu "Warum ist 0.3 - 0.2 - 0.1 (oder ähnlich) nicht gleich Null?"
"Einige Gleitkommazahlen können nicht exakt in binärer Form dargestellt werden. Wenn Sie versuchen, zwei Gleitkommazahlen zu vergleichen, sollten Sie sehr genau darauf achten, == zu verwenden. Eine alternative Vergleichsmethode ist es Überprüfen Sie, ob die beiden Zahlen, die Sie vergleichen, "nahe genug" sind "
Tags und Links matlab