f
的实际值是多少?
float f = std::numeric_limits<float>::max() + 1.0f;
对于无符号整数类型,可以定义为溢出到0,对于无符号整数类型,如果我没有记错的话,则是特定于未定义/实现的。但是在float / double标准中如何指定呢?是std::numeric_limits<float>::max()
还是变成std::numeric_limits<float>::infinity()
?
在cppreference上,到目前为止我还没有找到规范,也许我错过了。
感谢您的帮助!
在任何舍入模式下,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浮动随着量级的增加而变得稀疏和稀疏。