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;
}

Prints: else ブロック

#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;
}

Prints: if ブロック

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

使用コンパイラ: gcc-4.3.4

4

3 に答える 3

6

これは、1.1が 2 進浮動小数点で正確に表現できないためです。しかし1.5です。

その結果、floatとのdouble表現は のわずかに異なる値を保持します1.1

バイナリ浮動小数点として書き出された場合の違いは次のとおりです。

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

したがって、それらを比較すると(そしてfloatバージョンが昇格すると)、それらは等しくなりません。

于 2012-01-26T05:36:18.143 に答える
4

必読:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2012-01-26T05:34:24.837 に答える