iphone / Objective C - Vergleiche Doppel funktioniert nicht

8

Ich denke, ich werde verrückt. "counter" und "interval" sind beide Doubles. Dies geschieht auf Beschleunigungsmesser: didAccelerate in einem Intervall von (.01). "counter" sollte schließlich auf "interval" erhöht werden. Aus irgendeinem Grund kann ich dieses "wenn" nicht wahr werden lassen.

Habe ich etwas übersehen?

%Vor%     
azeven 19.01.2011, 07:13
quelle

2 Antworten

18

Vergleichen Sie niemals Doubles oder Floats mit Gleichheit - sie könnten bei der Anzahl der signifikanten Zahlen, die Sie untersuchen, gleich aussehen, aber der Computer sieht mehr.

Zu diesem Zweck stellt das Foundation Framework "epsilon" -Werte für verschiedene Typen wie "float" und "double" bereit. Wenn der Abstand zwischen zwei Zahlen kleiner als Epsilon ist, können Sie annehmen, dass diese beiden Zahlen gleich sind.

In Ihrem Fall würden Sie es wie folgt verwenden:

%Vor%

Oder in Swift 4:

%Vor%

Zwei sehr nützliche Links:

Was jeder Informatiker über Gleitkommaarithmetik wissen sollte p>

Freitag Q & amp; A 2011-01-04: Praktisch Fließkomma

    
Adam Eberbach 19.01.2011 07:21
quelle
2

In Ihrem else -Block fügen Sie 0.01 nicht zu counter hinzu, da dies kein darstellbarer Double-Precision-Wert ist. Sie fügen den Wert tatsächlich hinzu:

%Vor%

Es überrascht nicht, wenn Sie diesen Wert wiederholt zu sich selbst hinzufügen, erhalten Sie nie 0.5 genau.

Zwei Optionen: Besser ist es, die Bedingung if durch (counter >= interval) zu ersetzen. Alternativ könnten Sie eine kleine Potenz von zwei für das Inkrement verwenden, anstatt etwas, das nicht dargestellt werden kann, wie 0.0078125 .

    
Stephen Canon 19.01.2011 07:20
quelle