在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
时不会发生这种情况,但我发现令人惊讶的是,舍入发生在如此小的数字上。
答案 0 :(得分:5)
使用
float a = CALCULUS;
存储在a
中的值当然是32位单精度浮点值。在CALCULUS
的初始化中,double
扩展的结果从float
转换为a
。
但是,当您将CALCULUS
的扩展直接传递给printf
时,传递的值为double
。
简而言之,2052 - 1.0 - margin
的结果是 double
。