什么是浮点数的上溢和下溢

What is overflow and underflow in floating point

感觉自己不太理解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。所以最小数字的位模式是:

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 指定的一样,浮点数不会像整数那样溢出和下溢到一个非常错误的答案,例如你真的不应该以两个正数相乘而得到一个负数。

相反,溢出意味着结果是 'too large to represent'。根据舍入模式,这通常由 max float(RTZ) 或 Inf (RNE) 表示:

0 110 1111 * 0 110 1111 = 0 111 0000

(请注意,如您所知,整数溢出可以通过应用类似的钳位操作在硬件中避免,只是惯例不这样做。)

在处理浮点数时,术语下溢表示数字为 'too small to represent',通常结果为 0.0:

0 000 0001 * 0 000 0001 = 0 000 0000

请注意,我也听说过术语下溢用于表示溢出到非常大的负数,但这不是最好的术语。这是一个结果为负且太大而无法表示的示例,即 'negative overflow':

0 110 1111 * 1 110 1111 = 1 111 0000