我在Cnetos 6.2.0版64位计算机上运行一个简单的程序。
int main()
{
int b = 1078085270;//1078085218;
float a;
a = (float)(b);
printf("val of a is %f\n",a);
return 0;
}
a的输出是1078085248.我将值更改为1078085218.仍然得到相同的结果。我无法理解输出被破坏或更改的原因或方式?
有人可以解释一下吗?
答案 0 :(得分:4)
查看二进制数字1078085270
:
b1000000010000100100011010010110
IEEE-754单精度浮点数只有24位精度,但这个数字有超过24位有效位,所以当你将这个数字转换为float
时,它必须是四舍五入的。 float
中可表示的两个最接近的数字是:
b100000001000010010001101 0000000
b100000001000010010001110 0000000
(空格表示第24位和第25位之间的中断,数字为圆形的点)。因为您的数字更接近第一个数字,所以它会四舍五入到该值,即十进制的1078085248
。