Ist das ein Matlab-Fehler? Hast du das gleiche Problem? [Duplikat]

8

Meine Matlab-Version ist R2012a
Warum in Matlab 1.1-0.2 ist nicht gleich 0.9 !!!!!
Das ist schrecklich!

  

& gt; & gt; 1.1-0.2 == 0.9

     

ans =

%Vor%
    
Mahdi 04.12.2012, 09:23
quelle

3 Antworten

20

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.

    
Rody Oldenhuis 04.12.2012, 09:30
quelle
3

Ссылка

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 "

    
Michal B. 04.12.2012 09:30
quelle
2

Eine gute Funktion für diese Art von Dingen, um zu sehen, was vor sich geht, ist num2strexact vom Dateiaustausch

%Vor%

Sie sehen, sie sind nicht die gleichen.

Sieh dir die Unterschiede an, wenn du Double vs syms verwendest

%Vor%     
Nasser 04.12.2012 12:57
quelle

Tags und Links