由浮点组成的联合:完全疯狂的输出

#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

链接地址: http://www.djcxy.com/p/78621.html

上一篇: union consisting of float : completely insane output

下一篇: Is floating point precision mutable or invariant?