This question already has answers here:
How to detect double precision floating point overflow and underflow?

(4 个回答)


8年前关闭。




我需要关于如何以标准方式检测浮点下溢而不使用第三方库和有符号和无符号异常的帮助和示例代码。我用谷歌搜索,发现很多作者都在谈论“逐渐下溢算作下溢”?谁能解释一下什么是逐渐下溢?我需要检查这两种情况

感谢您的时间和帮助

最佳答案

查看“逐渐下溢”的顶部搜索结果并没有给出明确直接的答案,因此:

IEEE-754 二进制浮点数在其大部分范围内具有规则模式:有一个符号、一个指数和一个具有固定位数的有效数(32 位 float 为 24,64 位 double 为 53) .但是,模式必须在末端中断。在高端,对于最大指数而言太大的结果将更改为无穷大。在低端,我们有一个选择。

一种选择是,如果结果低于最低指数,则结果四舍五入为零。然而,IEEE-754 使用一种不同的方案,称为逐渐下溢。最低指数保留用于与常规指数不同的格式。

对于正常指数,24 位有效数为“1”。后跟在有效位字段中编码的 23 位。当数字低于正规数时,指数与最低的正则指数具有相同的值,但 24 位有效数为“0”。后跟 23 位。这是逐渐下溢的,因为随着数字变小,在我们达到零之前,它们的精度越来越低(有效数中更多的前导位为零)。

逐渐下溢有一些很好的数学特性,特别是 a-b == 0 当且仅当 a == b 。对于突然下溢,即使 a-b == 0a 不同,b 也有可能出现,因为 a-b 太小而无法以浮点格式表示。随着逐渐溢出,a-b 的所有可能值,对于小 ab ,都是可表示的,因为它们只是具有最低指数的有效数的差异。

确定是否发生浮点下溢的另一个问题是允许实现(IEEE-754 标准)根据舍入之前或之后的测试报告下溢。在计算结果时,浮点实现必须有效地执行以下步骤:

  • 计算精确结果的符号、指数和有效数。
  • 将结果四舍五入以适合浮点格式。如果有效数向上取整,这可能会增加指数。

  • 该标准允许实现报告下溢:
  • 计算精确结果的符号、指数和有效数。
  • 指数是否小于正常范围?如果是,则报告下溢。
  • 将结果四舍五入以适合浮点格式。如果有效数向上取整,这可能会增加指数。

  • 或者:
  • 计算精确结果的符号、指数和有效数。
  • 将结果四舍五入以适合浮点格式。如果有效数向上取整,这可能会增加指数。
  • 指数是否小于正常范围?如果是,则报告下溢。

  • 因此,浮点数的两种不同实现可能会针对同一计算返回有关下溢的不同报告。

    (还有一些关于处理下溢的附加规则。以上会导致发出下溢异常信号。但是,如果未启用来自此异常的陷阱并且结果是准确的 [舍入没有改变任何内容],则忽略“下溢” ,并且不引发下溢标志。如果结果不精确,则引发下溢并发出不精确异常信号。)

    关于c++ - 如何检测C中的浮点下溢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15675091/

    10-11 04:42