首页 > 解决方案 > float_max + 1 在 C++ 中是如何定义的?

问题描述

的实际值是f多少?

float f = std::numeric_limits<float>::max() + 1.0f;

对于无符号整数类型,它很好地定义为溢出到 0,而对于有符号整数,如果我没记错的话,它是未定义/特定于实现的。但是它是如何在标准中为浮点/双精度指定的?是std::numeric_limits<float>::max()还是变成了std::numeric_limits<float>::infinity()

在 cppreference 上,到目前为止我还没有找到规范,也许我错过了。

感谢帮助!

标签: c++floating-point

解决方案


在任何舍入模式下,max + 1都将简单地max使用 IEEE-754 单精度浮点数。

请注意,最大正有限 32 位浮点数是:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 11111110 11111111111111111111111
             Hex: 7F7F FFFF
       Precision: SP
            Sign: Positive
        Exponent: 127 (Stored: 254, Bias: 127)
       Hex-float: +0x1.fffffep127
           Value: +3.4028235e38 (NORMAL)

要使用默认舍入模式 round-nearest-ties-to-even 溢出并变为无穷大,您必须至少添加:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 11100110 00000000000000000000000
             Hex: 7300 0000
       Precision: SP
            Sign: Positive
        Exponent: 103 (Stored: 230, Bias: 127)
       Hex-float: +0x1p103
           Value: +1.0141205e31 (NORMAL)

您添加的任何小于此特定值的内容都会将其四舍五入回到最大值本身。不同的舍入模式可能会产生略微不同的结果,但是您要查找的数字的顺序大约是1e31,这是相当大的。

这是一个很好的例子,说明 IEEE 浮点数如何随着大小的增加而变得越来越稀疏。


推荐阅读