【问题标题】:What is overflow and underflow in floating point什么是浮点数的上溢和下溢
【发布时间】:2017-02-26 04:55:49
【问题描述】:

我觉得我不是很了解overflowunderflow 的概念。我问这个问题是为了澄清这一点。我需要在最基本的层面上用比特来理解它。让我们使用1 byte - 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 

谁能使用我上面概述的位模式演示其他三种溢出和下溢情况?

【问题讨论】:

  • 也许this question 会有所帮助?
  • @evolutionxbox,谢谢,但我已经知道了
  • 那我会密切关注你的问题...

标签: javascript floating-point ieee-754


【解决方案1】:

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

【讨论】:

  • 在浮点的上下文中,我从来没有遇到过表示“大而负”的“下溢”。您有任何链接或参考资料吗?
  • 谢谢,如何在上溢时获得负无穷大而在下溢时获得负零?
  • 没有参考资料,但我听说有人提到它,我认为这不是很好,所以让我编辑答案以澄清这一点。
  • 当计算的完全准确结果是一个小的负数时,使用负零。负无穷是上面的最后一个例子,我要澄清一下。
  • @Casperrw,谢谢,我的理解是否正确,即超过 MAX_VALUE 的正数或负数会发生溢出,而低于 MIN_VALUE 的正数或负数会发生下溢?
猜你喜欢
  • 2023-03-16
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2013-07-10
  • 2018-02-28
  • 2023-03-21
相关资源
最近更新 更多