4

考虑这段代码:

import numpy
numpy.seterr(under='warn')
x1 = 1 + 1j / (1 << 533)
x2 = 1 - 1j / (1 << 533)
y1 = x1 * 1.1
y2 = x2 * 1.1
z1 = x1 / 1.1
z2 = x2 / 1.1
print(numpy.divide(1, x1))  #              1-3.55641399918e-161j  # OK
print(numpy.divide(1, x2))  #              1+3.55641399918e-161j  # OK
print(numpy.divide(1, y1))  # 0.909090909091-3.23310363561e-161j  # underflow
print(numpy.divide(1, y2))  # 0.909090909091+3.23310363561e-161j  # underflow
print(numpy.divide(1, z1))  #            1.1-3.91205539909e-161j  # underflow
print(numpy.divide(1, z2))  #            1.1+3.91205539909e-161j  # underflow

无论我怎么看,下溢似乎都没有意义。就像维基百科的,

下溢是计算机程序中的一种情况,其中计算结果的绝对值小于计算机实际存储在其 CPU 内存中的数量。

但很明显,计算机能够将数字存储在相关值的大致附近,因此该定义似乎与我在这里看到的行为完全不一致。

有人可以解释为什么其中一些会出现下溢,而另一些则不会?
这是正确的行为还是错误?

4

1 回答 1

0

要进行此数学运算,您首先需要“缩放”,可以这么说,3.23310363561e-161。这就是触发下溢的原因

  0.909090909091
- 3.23310363561e-161 =
--------------------

  0.909090909091 x 10^0
- 3.23310363561 x 10^-161 =
-------------------------

  0.909090909091 x 10^0
- 0.000...                 0323310363561 =
    ^^^^^^^^^^^^^^^^^^^^^^^^
    160 0s
  --------------------------------------
于 2022-02-25T15:25:38.063 回答