为什么 `math.ldexp` 会针对指数>1024 引发 OverflowError,但不会针对指数<-1073 引发溢出错误?
Why does `math.ldexp` raise OverflowError for exponent>1024, but not for exponent<-1073?
math.ldexp(0.5, 1025)
结果是 OverflowError
。 Numpy 的等价函数 returns inf
。然而,在另一端,math.ldexp(0.5, -1074)
不会引发异常,而是 returns 0.0
,如下所示:
In [275]: math.ldexp(0.5, 1024)
Out[275]: 8.98846567431158e+307
In [276]: math.ldexp(0.5, 1025)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-276-ce1573e0249b> in <module>()
----> 1 math.ldexp(0.5, 1025)
OverflowError: math range error
In [277]: math.ldexp(0.5, -1073)
Out[277]: 5e-324
In [278]: math.ldexp(0.5, -1074)
Out[278]: 0.0
为什么 Python 指数过大时会出现 OverflowError
而指数过小时则不会?是否有正当理由,或者这应该被视为错误?
众所周知,IEEE 浮点运算存在一定程度的不精确性。 0.0 是一个非常接近 math.ldexp(0.5, -1074)
的值。但是,没有有效的方法来表达接近 math.ldexp(0.5, 1025)
的值,所以我认为这就是它引发异常的原因。
math.ldexp(0.5, 1025)
结果是 OverflowError
。 Numpy 的等价函数 returns inf
。然而,在另一端,math.ldexp(0.5, -1074)
不会引发异常,而是 returns 0.0
,如下所示:
In [275]: math.ldexp(0.5, 1024)
Out[275]: 8.98846567431158e+307
In [276]: math.ldexp(0.5, 1025)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-276-ce1573e0249b> in <module>()
----> 1 math.ldexp(0.5, 1025)
OverflowError: math range error
In [277]: math.ldexp(0.5, -1073)
Out[277]: 5e-324
In [278]: math.ldexp(0.5, -1074)
Out[278]: 0.0
为什么 Python 指数过大时会出现 OverflowError
而指数过小时则不会?是否有正当理由,或者这应该被视为错误?
众所周知,IEEE 浮点运算存在一定程度的不精确性。 0.0 是一个非常接近 math.ldexp(0.5, -1074)
的值。但是,没有有效的方法来表达接近 math.ldexp(0.5, 1025)
的值,所以我认为这就是它引发异常的原因。