c++ - 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 上,到目前为止我还没有找到规范,也许我错过了。
感谢帮助!
解决方案
在任何舍入模式下,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 浮点数如何随着大小的增加而变得越来越稀疏。
推荐阅读
- javascript - 可选链接 - Function.prototype.apply 在未定义时调用,这是未定义而不是函数
- google-sheets - 表格公式查找当前月份的总和
- c - 如果 Else 程序执行 Else 部分,为什么会这样?
- python - 如何打印导致if语句为真的字符串python3
- python - 按总值对堆积柱形图进行排序 - Python
- python - 使用数组创建/填充 json
- javascript - 绑定一个接受三个参数并接受中间一个的函数
- r - 当 df 具有自定义类时,tidyr::unite 失败
- ionic-framework - 如何在设备上使用 ionic 端口 8080
- node.js - 在 AWS ECS Fargate 中运行 Nodejs docker 时出错