在C ++中如何定义float_max +1?

问题描述 投票:4回答:1

f的实际值是多少?

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

对于无符号整数类型,可以定义为溢出到0,对于无符号整数类型,如果我没有记错的话,则是特定于未定义/实现的。但是在float / double标准中如何指定呢?是std::numeric_limits<float>::max()还是变成std::numeric_limits<float>::infinity()

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

感谢您的帮助!

c++ floating-point
1个回答
0
投票

在任何舍入模式下,max + 1都将是具有IEEE-754单精度浮点数的max

请注意,最大正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)

要使此数字溢出并使用默认的四舍五入关系为四舍五入的关系,您必须至少添加:

                  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浮动随着量级的增加而变得稀疏和稀疏。

© www.soinside.com 2019 - 2024. All rights reserved.