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