考虑以下代码:
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
无论我怎么看,下溢似乎都没有意义。像维基百科says,
下溢是计算机程序中的一个条件,其中计算结果的绝对值小于计算机实际存储在其CPU内存中的。
但很明显,计算机能够存储大致相关值的数字,因此这个定义似乎与我在这里看到的行为完全一致。
有人可以解释为什么其中一些正在给予下溢但其他人不是吗? 这是正确的行为还是一个错误?