Рассмотрим этот код:
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
Нижний поток, кажется, не имеет смысла, независимо от того, как я на это смотрю. Как говорится в Википедии ,
Опустошение – это состояние компьютерной программы, при котором результатом вычисления является число, меньшее абсолютного значения, чем компьютер может фактически хранить в памяти своего ЦП.
Но очевидно, что компьютер способен хранить числа в непосредственной близости от рассматриваемых значений, поэтому определение совсем не согласуется с тем поведением, которое я здесь вижу.
Может ли кто-нибудь объяснить, почему именно некоторые из них дают потери памяти, а другие нет?
Это правильное поведение или это ошибка?
y1.imag*(y1.imag/y1.real)
. Сy1.imag = 3.912055399093737e-161
в результате этого расчета получается денормализованное число, которое должно вызвать аннулирование FPE. Это комментарий, а не ответ, потому что я не знаю, почему другие расчеты не вызывают потерю значимости. - person Warren Weckesser   schedule 16.08.2017a = x1.imag
. Почемуnp.multiply(a, 1.6*a)
вызывает предупреждение о недостаточном объеме, аnp.multiply(a, 1.5*a)
иnp.multiply(a, 2.0*a)
нет? - person Warren Weckesser   schedule 16.08.2017