什么是浮点溢出和下溢

时间:2016-10-17 09:11:22

标签: javascript floating-point ieee-754

我觉得我并不真正理解overflowunderflow的概念。我问这个问题是为了澄清这一点。我需要在最基本的层面上理解它。让我们使用1字节 - 1位符号,3位指数和4位尾数的简化浮点表示法:

0 000 0000

我们可以存储的最大指数是111_2=7减去偏差K=2^2-1=3,它提供4,并且保留给InfinityNaN。最大数字的指数为3,在偏移二进制数下为110

所以最大数字的位模式是:

0 110 1111 // positive
1 110 1111 // negative

当指数为零时,该数字是次正规的,并且具有隐式0而不是1。所以min号的位模式是:

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 

任何人都可以使用上面列出的位模式演示其他三种溢出和下溢情况吗?

1 个答案:

答案 0 :(得分:2)

当然以下是依赖于实现的,但是如果数字的行为类似于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