比较float和double in C

问题描述 投票:1回答:2

我编写了以下代码来比较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;
}

我正在使用在线C编译器here来编译我的代码。

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

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

c floating-point
2个回答
3
投票

如果声明两个变量后将添加以下两行:

printf("%.9g\n", f);
printf("%.17g\n", d);

您将获得以下输出:

1.10000002                                                                                                                  
1.1000000000000001

因此,很容易看出由于[[precision,floatdouble大,因此GREATER的打印很好。


0
投票
最接近浮点数的精确值是1.10000002384185795791015625。二进制等效项是1.00011001100110011001101

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

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

1.00011001100110011001101 1.0001100110011001100110011001100110011001100110011010

舍入为浮点数的前几个截断位是11001100,它大于一半,因此对浮点数的转换被四舍五入,从而使其最低有效位为11001101。舍入导致最大有效差为1中的浮点数。双精度位的位为0。浮点数大于double,无论较低有效位的值在扩展为double的float中为零,还是在double中为非零。
© www.soinside.com 2019 - 2024. All rights reserved.