2016-07-07 17 views
-3

Ich füge einige float s in einer Schleife zusammen. Ich erwartete, dass, wenn i 9 erreicht, die Summe gleich 1 ist, und NSLog(@"EXTRA: %f", sum); wird ausgeführt. Es wird nie ausgeführt ... was ist hier los?Summe von zehn 0,1 floats ist nicht gleich 1

Hier ist mein Code:

float number = 0.1; 
float sum = 0; 

for (int i = 0; i < 1000; i++) { 
    sum += number; 

    if (sum == 1) { 
     NSLog(@"EXTRA: %f", sum); 
    } 
    NSLog(@"%f", sum); 
} 
+0

Versuchen Sie 0.1 + 0.2 und wenn Sie wissen, Binär, schreiben Sie 0.1 in binär. – Tim

+0

Habe in Jahren keine binäre gemacht – MegaManX

Antwort

3

Der binäre Wert von 1/10 ist wie der denary Wert von 1/3 - es reccurs. Tatsächlich ist der in der Variablen gespeicherte Wert 1/100.0001100110011001100110011....

Aber die Länge dieser Zahl wird durch die float Länge oder ein 32/64-Bit-OS beschränkt.

Also, wenn ich 0.000110011 zu 0.000110011 hinzufügen ich 0.001100110 die nicht ganz 2/10 ist, die gleiche wie 0.333333 + 0.333333 =! 2/3 - es entspricht 0.66666.

Diese 9mal geschieht, und so 1/10 * 10 binär nicht gleich 1, es 0,111111111 ist die 0.998046875 gleich - ein langer Weg 1.

Zu mehr Dezimalstellen (z. B. 30) 0.000110011001100110011001100110 * 1010 = 0.111111111111111111111111111100 oder 0.999999996274709701538085937500. Was ist nicht ganz 1.