比较C中的float和double

Rij*_*uly 2 c floating-point

我编写了以下代码,以比较C中的float变量和double变量。

int main()
{
    float f = 1.1;
    double d = 1.1;

    if(f==d)
        printf("EQUAL");

    if(f < d)
        printf("LESS");

    if(f > d)
        printf("GREATER");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里使用在线C编译器来编译我的代码。

我知道,绝不会为重复的小数点打印EQUAL。但是,我期望应该打印的是LESS,因为double应该具有更高的精度,因此应该比float更接近1.1的实际值。据我所知,在C中,当您比较float和double时,float的尾数会零扩展为double,并且零扩展的值应始终较小。

而是在所有情况下都打印GREATER。我在这里想念什么吗?

Dav*_*d S 6

如果在声明 2 个变量后添加以下 2 行:

printf("%.9g\n", f);
printf("%.17g\n", d);
Run Code Online (Sandbox Code Playgroud)

您将获得以下输出:

1.10000002                                                                                                                  
1.1000000000000001
Run Code Online (Sandbox Code Playgroud)

所以很容易地看到,由于精度的float是大于所述double的这样的打印GREATER是好的。

  • “由于精度原因,浮点数大于双精度”有点误导。由于精度不同,其值也不同。在这种情况下,“浮动”更大。大约一半的非精确小数,“double”会更大。 (2认同)

Pat*_*han 5

最接近1.1的浮点数的精确值是1.10000002384185791015625。二进制等效值为1.00011001100110011001101

最接近于1.1的double的精确值是1.100000000000000088817841970070023223233890533447265625。二进制等效项为1.0001100110011001100110011001100110011001100110011010。

将两个二进制数字彼此相邻排列:

1.00011001100110011001101
1.0001100110011001100110011001100110011001100110011010
Run Code Online (Sandbox Code Playgroud)

舍入为浮点数的前几个截断位是11001100,它大于一半,因此对浮点数的转换被四舍五入,使其最低有效位为11001101。舍入导致最高浮点数的差值为1在double中为0的位置。浮点数大于双精度数,而不管低有效位的值在扩展为双精度的浮点数中为零,还是在双精度数中非零。