在英特尔(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/

10-11 19:36