由浮子组成的联盟:完全疯狂的输出

Rub*_*bee 4 c c++ floating-point unions

#include <stdio.h>

union NumericType
{
    float value;
    int intvalue;
}Values;

int main()
{
    Values.value = 1094795585.00;
    printf("%f \n",Values.value);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该计划输出如下:

1094795648.000000 
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样?为什么浮动的价值会Values.value增加?或者我在这里遗漏了什么?

Ste*_*non 27

首先,这与使用a没有任何关系union.

现在,假设你写道:

int x = 1.5;
printf("%d\n", x);
Run Code Online (Sandbox Code Playgroud)

会发生什么? 1.5不是一个整数值,所以它被转换为一个整数(通过截断),x因此实际上得到的值1,这正是打印的.

在你的例子中发生了同样的事情.

float x = 1094795585.0;
printf("%f\n", x);
Run Code Online (Sandbox Code Playgroud)

1094795585.0不能表示为单精度浮点数,因此它将转换为可表示的值.这通过四舍五入发生.两个最接近的值是:

1094795520 (0x41414100) -- closest `float` smaller than your number
1094795585 (0x41414141) -- your number
1094795648 (0x41414180) -- closest `float` larger than your number
Run Code Online (Sandbox Code Playgroud)

因为您的数字稍微接近较大的值(如果您查看十六进制表示,这会更容易看到),它会舍入到该值,因此这是存储x的值,也就是打印的值.


Pet*_* G. 14

一个浮动是不是准确,你想的那样.其有效24位的尾数仅提供7-8个十进制数字的精度.您的示例需要10位十进制数字.double有一个有效的53位尾数,提供15-16位精度,足以满足您的需要.

  • 需要花费大量的精力,浮动精度的基本事实根本不明显.我不知道为什么会这么高兴. (2认同)

Car*_*rum 7

这是因为您的float类型没有显示该数字的精度.用一个double.

  • 我认为它应该舍入到最近的可用浮点数.我把它留作练习:-). (3认同)