C - 小数字上的浮点舍入

时间:2017-06-29 16:09:24

标签: c floating-point rounding-error

在Intel(R)Core(TM)i7-4790上运行这段代码,我得到了奇怪的结果:

#include <stdio.h>
#define CALCULUS 2052 - 1.0 - margin
void main(void)
{
    float margin = 1.0001;
    float a = CALCULUS;
    printf("%2.6f\t%2.6f\n", a, CALCULUS);
}

我有

$ gcc test2.c && ./a.out
2050.000000 2049.999900

有人可以解释这种行为吗? 我知道当我使用double而不是float时不会发生这种情况,但我发现令人惊讶的是,舍入发生在如此小的数字上。

1 个答案:

答案 0 :(得分:5)

使用

float a = CALCULUS;

存储在a中的值当然是32位单精度浮点值。在CALCULUS的初始化中,double扩展的结果从float转换为a

但是,当您将CALCULUS的扩展直接传递给printf时,传递的值为double

简而言之,2052 - 1.0 - margin的结果是 double