我对以下C程序的输出有疑问。我尝试使用Visual C++ 6.0和MinGW32(gcc 3.4.2)编译它。
#include <stdio.h>
int main() {
int x = 2147483647;
printf("%f\n", (float)2147483647);
printf("%f\n", (float)x);
return 0;
}
输出结果为:
2147483648.000000
2147483647.000000
我的问题是:为什么这两行不同?当您将整数值2147483647转换为IEEE 754浮点格式时,它会被近似为2147483648.0。因此,我预期这两行都将等于2147483648.000000。
编辑:值"2147483647.000000"不能是单精度浮点值,因为数字2147483647在IEEE 754单精度浮点格式中无法准确表示,会造成精度损失。
-O2
或-O3
的 gcc 4.9 会为两者都生成2147483648.000000
,而没有任何优化,则会产生与您在帖子中类似的输出。 - P.Pint
转换为float
(通过强制类型转换),然后从float
转换为double
(因为printf
是一个变参函数)。原则上,由于使用的实现特征,这两个调用都应该打印出2147483648.000000
。一些尝试:检查生成的汇编代码(编译器可能已经对其进行了优化,将两个转换合并为一个)。尝试将两个表达式(float)2147483647
和(float)x
存储到float
对象中并打印它们的值,或者检查它们的表示形式。 - Keith Thompson