什么是浮点中的溢出和下溢?

What is overflow and underflow in floating point

本文关键字:溢出 下溢 什么      更新时间:2023-09-26

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

0 000 0000

我们可以存储的最大指数是111_2=7减去K=2^2-1=3得到的4,它保留给InfinityNaN。max number的指数为3,即偏移二进制下的110

所以max number的位模式是:
0 110 1111 // positive
1 110 1111 // negative

当指数为0时,表示该数是次正规的,并且隐含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

注意,我也听说过术语underflow被用来表示溢出到一个非常大的负数,但这不是最好的术语。这是一个结果为负且太大而无法表示的例子。"负面溢出":

0 110 1111 * 1 110 1111 = 1 111 0000