串流失去精度

时间:2016-02-18 01:35:13

标签: c++ floating-point floating-accuracy stringstream static-cast

在我的一个应用程序中,我试图将一个浮点值放入字符串流中,如下所示:

stream << static_cast<float>(double value);

不是获取整个浮点值,而是只得到它的整数部分。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:-1)

你正在转向float - C ++定义为IEEE 754 32-bit 'single precision' floating point type

如果查找这样一个值的格式,32位将在三个组件之间分开:

  • 存储有效数字的23位
  • 存储指数的8位
  • 1位用于存储标志。

如果你有23位来存储signifcand,这意味着你可以在有效数字中表示的最大值是2 ^ 23。因此,单精度浮点只有大约6-9位精度。

如果您的浮点值在小数点前有9位或更多位 - 如果它超过2 ^ 23 - 您将永远不会有小数分量。

要帮助深入了解,请考虑以下代码:

    void Test()
    {
        float test = 8388608.0F;

        while( test > 0.0F )
        {
            test -= 0.1F;
        }
    }

该代码永远不会终止。每当我们尝试将测试减少0.1时,幅度的变化就会丢失,因为我们没有精确的存储量,因此该值最终会回到8388608.0。没有任何进展,所以它永远不会终止。对于所有有限精度浮点类型都是如此,因此您会发现IEEE 754双精度浮点类型(64位)同样存在同样的问题,只是在不同的更大值处。

此外,如果您的目标是尽可能保持精确度,那么从double投射到float是没有意义的。 double是64位浮点类型; float是32位浮点类型。如果您使用了double,那么如果您的值足够小,则可以避免大部分截断。