我正在阅读英特尔手册 (Intel® 64 和 IA-32 架构软件开发人员手册 *2016),对于关于需要下溢异常的这则摘录,我想确认自己的理解是否正确:
检测和处理下溢能够防止一个非常小的结果通过计算传播,并在后续时刻造成其他异常(例如除法时的溢出)生成。
-第4.9.1.5节
那么我的问题是,这种情况会是什么样子呢?可以有可能的伪代码演算吗?
veryVerySmallNumber = SmallestFloatpossible -1
veryVeryLargeNumber = BigBigFloat
answer = veryVerySmallNumber / veryVeryLargeNumber
我看到处理器可以有两种处理方式,但我更关心的是如何才会导致下溢出现上溢。对于这些情况的处理一般精神的任何澄清也将不胜感激。
INT_MIN - 1
的值是多少? - AnT stands with RussiaINT_MIN/-1
。数学结果是-INT_MIN
,这个结果无法表示。 - riciFLT_TRUE_MIN
(最小的次正规数)。它非常接近于零。FLT_TRUE_MIN - 1
是-1.0f
,由于舍入误差而丢失了+FLT_TRUE_MIN
。即使是FLT_MIN
(最小的规格化数),仍然比-1.0
和nextafterf(-1.0, INFINITY)
之间的差异要小得多。(IEEE 32位浮点数的FLT_MIN = 1.175494e-38
,FLT_EPSILON = 1.192093e-7
。) - Peter CordesveryVerySmallNumber = FLT_MIN
。任何大于1.0的分子都会导致以FLT_MIN
作为分母的溢出到+Inf。甚至1.0 / FLT_TRUE_MIN
也会溢出,因为IEEE FP不会进行渐进式溢出。 - Peter Cordes