我觉得我不太明白这个概念overflow
and underflow
。我问这个问题是为了澄清这一点。我需要从最基本的层面来理解它。让我们使用简化的浮点表示1
byte - 1
位符号,3
位指数和4
位尾数:
0 000 0000
我们可以存储的最大指数是111_2=7
减去偏差K=2^2-1=3
这使4
,并且它被保留用于Infinity
and NaN
。最大数的指数是3
,即110
在偏移二进制下。
所以最大数量的位模式是:
0 110 1111 // positive
1 110 1111 // negative
当指数为零时,该数是次正规数并且具有隐式0
代替1
。所以最小数的位模式是:
0 000 0001 // positive
1 000 0001 // negative
我找到了单精度浮点的这些描述:
Negative numbers less than −(2−2−23) × 2127 (negative overflow)
Negative numbers greater than −2−149 (negative underflow)
Positive numbers less than 2−149 (positive underflow)
Positive numbers greater than (2−2−23) × 2127 (positive overflow)
其中我只明白正溢出这导致+Infinity
,示例如下:
0 110 1111 + 0 110 1111 = 0 111 0000
任何人都可以使用我上面概述的位模式演示溢出和下溢的其他三种情况吗?
当然,以下内容取决于实现,但如果数字的行为类似于 IEEE-754 指定的内容,则浮点数不会像整数那样溢出和下溢到完全错误的答案,例如你真的不应该以两个正数相乘而得到负数。
相反,溢出意味着结果“太大而无法表示”。根据舍入模式,这通常由 max float(RTZ) 或 Inf (RNE) 表示:
0 110 1111 * 0 110 1111 = 0 111 0000
(请注意,正如您所知,可以通过应用类似的钳位操作在硬件中避免整数溢出,但这不是这样做的惯例。)
在处理浮点数时,术语“下溢”意味着该数字“太小而无法表示”,通常只会导致 0.0:
0 000 0001 * 0 000 0001 = 0 000 0000
请注意,我还听说过术语“下溢”用于表示溢出到非常大的负数,但这不是它的最佳术语。这是结果为负且太大而无法表示的示例,即“负溢出”:
0 110 1111 * 1 110 1111 = 1 111 0000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)