什么是浮点数上溢和下溢

Max*_*kyi 7 javascript floating-point ieee-754

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

0 000 0000
Run Code Online (Sandbox Code Playgroud)

我们可以存储的最大指数111_2=7减去K=2^2-1=3给出的偏差4,它是为Infinity和保留的NaN。max number 的指数是3,它110在偏移二进制之下。

所以最大数的位模式是:

0 110 1111 // positive
1 110 1111 // negative
Run Code Online (Sandbox Code Playgroud)

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

0 000 0001 // positive
1 000 0001 // negative
Run Code Online (Sandbox Code Playgroud)

我找到了单精度浮点的这些描述:

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)
Run Code Online (Sandbox Code Playgroud)

其中,我只理解导致 的正溢出+Infinity示例如下:

0 110 1111 + 0 110 1111 = 0 111 0000 
Run Code Online (Sandbox Code Playgroud)

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

Cas*_*rrw 5

当然,以下内容取决于实现,但是如果数字的行为类似于 IEEE-754 指定的内容,浮点数不会像整数一样溢出和下溢到非常不正确的答案,例如,您真的不应该最终得到两个正数乘以产生负数。

相反,溢出意味着结果“太大而无法表示”。根据舍入模式,这通常由 max float(RTZ) 或 Inf (RNE) 表示:

0 110 1111 * 0 110 1111 = 0 111 0000
Run Code Online (Sandbox Code Playgroud)

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

在处理浮点数时,术语下溢意味着数字“太小而无法表示”,通常只会导致 0.0:

0 000 0001 * 0 000 0001 = 0 000 0000
Run Code Online (Sandbox Code Playgroud)

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

0 110 1111 * 1 110 1111 = 1 111 0000
Run Code Online (Sandbox Code Playgroud)

  • 在浮点的上下文中,我从未遇到过表示“大且负”的“下溢”。您有任何链接或参考吗? (2认同)