在英特尔(R)酷睿(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
时不会发生这种情况,但我发现这样小的数字出现舍入是令人惊讶的。 最佳答案
与
float a = CALCULUS;
存储在
a
中的值当然是32位单精度浮点值。在初始化CALCULUS
时,double
扩展的结果从afloat
转换为aa
。但是,当将
CALCULUS
的扩展直接传递给printf
时,传递的是double
值。简而言之,
2052 - 1.0 - margin
的结果是adouble
。关于c - C-小数上的浮点舍入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44830201/