2012-01-26 19 views
3
#include <stdio.h> 
int main(void){ 
    float a = 1.1; 
    double b = 1.1; 
    if(a == b){ 
     printf("if block"); 
    } 
    else{ 
     printf("else block"); 
    } 
    return 0; 
} 

プリント:elseブロック比較floatとdouble

#include <stdio.h> 
int main(void){ 
    float a = 1.5; 
    double b = 1.5; 
    if(a == b){ 
     printf("if block"); 
    } 
    else{ 
     printf("else block"); 
    } 
    return 0; 
} 

プリント:?ブロック

は、この背後にあるロジックは何ですか

コンパイラを使用:GCC-4.3.4

+0

コンパイラで '-Wfloat-equal'を有効にしてみてください。これは有用な警告です。 – Borealid

答えて

6

1.1は、バイナリ浮動小数点では正確に表現できないためです。しかし、1.5です。

結果として、floatdouble表現は、少し異なる値の1.1を保持します。ここで

が正確に差がバイナリ浮動小数点として書き出されたとき:

(float) 1.1 = (0.00011001100110011001101)₂ 
(double)1.1 = (0.0001100110011001100110011001100110011001100110011010)₂ 

をこのように、あなたが彼ら(とfloatバージョン進めます)を比較するとき、彼らは同じではありません。

+0

最初の0は1であるべきです。それは浮動小数点表現で暗黙的です:D –

1

バイナリ1.1小数点の正確な値は、分数1.00011001100110011001100(1100)は、非終了さ....二重定数1.1は、53ビットの切り捨て/その仮数の近似値です。これをfloatに変換すると、仮数はちょうどビットで表されます。

floatをdoubleに変換すると、仮数は53ビットに戻りますが、24を超える数字のすべてのメモリが失われます。値はゼロ拡張され、今比較しています(たとえば、あなたは1.1の代わりに1.5を使用した場合、今

1.0001100110011001100110011001100110011001100110011001 

1.0001100110011001100110000000000000000000000000000000 

)丸め動作に応じて、

小数点以下の桁数は、正確にです。です。それは、フロートのゆえでも24ビットが誇張されている、ちょうどビットの仮数に正確に提示することができます...あなたが持っているもの

1.1000000000000000000000000000000000000000000000000000 

1.10000000000000000000000 

後者、ゼロ拡張されますダブルになるのは、明らかに同じ数である

1.1000000000000000000000000000000000000000000000000000 

です。

+0

追加情報ありがとう:) –