由浮点组成的联合:完全疯狂的输出
#include <stdio.h>
union NumericType
{
float value;
int intvalue;
}Values;
int main()
{
Values.value = 1094795585.00;
printf("%f n",Values.value);
return 0;
}
该计划输出如下:
1094795648.000000
有谁可以解释为什么会发生这种情况? 为什么float Values.value
的值增加? 或者我在这里错过了什么?
首先,这与使用union
没有任何关系。
现在,假设你写:
int x = 1.5;
printf("%dn", x);
会发生什么? 1.5
不是一个整数值,所以它被转换为一个整数(通过截断)和x
所以实际上得到值1
,这正是打印的。
你的例子中发生了完全相同的事情。
float x = 1094795585.0;
printf("%fn", x);
1094795585.0
不能表示为单精度浮点数,因此它会转换为可表示的值。 这是通过舍入来实现的。 最接近的两个值是:
1094795520 (0x41414100) -- closest `float` smaller than your number
1094795585 (0x41414141) -- your number
1094795648 (0x41414180) -- closest `float` larger than your number
因为你的数字稍微接近较大的值(如果你看一下十六进制表示,这样看起来会更容易一些),它会舍入到这个值,所以这就是存储在x
中的值,这就是打印的值。
漂浮不如你期望的那样精确。 其有效24位的尾数仅提供7至8位十进制数字的精度。 你的例子需要10位十进制数字精度。 一个double有一个有效的53位尾数,它提供了15-16位数的精度,足以满足你的目的。
这是因为你的float
类型没有显示该数字的精度。 使用double
。