比较浮动和双重

时间:2012-01-26 05:33:12

标签: c floating-point floating-point-conversion

#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阻止

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

打印:if block

这背后的逻辑是什么?

使用的编译器:gcc-4.3.4

3 个答案:

答案 0 :(得分:6)

这是因为1.1在二进制浮点中不能完全表示。但1.5是。

因此,floatdouble表示形式的1.1值略有不同。

这里写的是二进制浮点时的区别:

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

因此,当您比较它们(并且float版本被提升)时,它们将不相等。

答案 1 :(得分:4)

答案 2 :(得分:1)

二进制1.1十进制的精确值是非结束分数1.00011001100110011001100(1100)....双常数1.1是53位截断/ 尾数的近似值 。现在转换为float时,尾数将仅以 24 位表示。

float转换回双倍时,尾数现在又回到了53位,但超过24的数字的所有内存都会丢失 - 该值是零扩展的,现在你正在比较(例如,取决于舍入行为)

1.0001100110011001100110011001100110011001100110011001

1.0001100110011001100110000000000000000000000000000000

现在,如果您使用的是1.5而不是1.1;

1.5十进制正好 1.1二进制。它可以精确地呈现在 2 位尾数中,因此即使24位浮点数也是夸张的......你所拥有的是

1.1000000000000000000000000000000000000000000000000000

1.10000000000000000000000

后者,零扩展为双倍

1.1000000000000000000000000000000000000000000000000000

显然是相同的数字。