考虑这段代码:
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 内存中的数量。
但很明显,计算机能够将数字存储在相关值的大致附近,因此该定义似乎与我在这里看到的行为完全不一致。
有人可以解释为什么其中一些会出现下溢,而另一些则不会?
这是正确的行为还是错误?