2016-07-07 1 views
-3

私はループ内にfloatをいくつか追加しています。 iが9に達すると、合計は1に等しくなり、NSLog(@"EXTRA: %f", sum);が実行されると予想しました。それは決して実行されません...ここで何が起こっているのですか?ここで0.1の浮動小数点の合計が1と等しくない

は私のコードです:1/10

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

0.1 + 0.2を試してください。バイナリを知っている場合は、バイナリで0.1を書き出してください。 – Tim

+0

何年も前にバイナリを実行していない – MegaManX

答えて

3

バイナリ値は1/3のDenary値のようなものです - それはreccurs。実際には、変数に格納されている1/10の値は0.0001100110011001100110011...です。

ただし、この数値の長さは、floatの長さまたは32/64ビットのOSによって制限されます。

私は0.0001100110.000110011を追加するときだから私はかなり2/10ない0.0011001100.333333 + 0.333333 =と同じを入手! 2/3 - それは0.66666に等しい。

これは9回起こっている、などのバイナリで1/10 * 101等しく、それは0.998046875に等しい0.111111111だしない - 1オフ長い道のり。

小数点以下(例えば30)0.000110011001100110011001100110 * 1010 = 0.111111111111111111111111111100または0.999999996274709701538085937500です。どちらかというと1ではありません。

関連する問題