Почему сложное деление с плавающей запятой странным образом с NumPy?

Рассмотрим этот код:

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

Нижний поток, кажется, не имеет смысла, независимо от того, как я на это смотрю. Как говорится в Википедии ,

Опустошение – это состояние компьютерной программы, при котором результатом вычисления является число, меньшее абсолютного значения, чем компьютер может фактически хранить в памяти своего ЦП.

Но очевидно, что компьютер способен хранить числа в непосредственной близости от рассматриваемых значений, поэтому определение совсем не согласуется с тем поведением, которое я здесь вижу.

Может ли кто-нибудь объяснить, почему именно некоторые из них дают потери памяти, а другие нет?
Это правильное поведение или это ошибка?


person user541686    schedule 16.08.2017    source источник
comment
Промежуточное вычисление в коде C, реализующее комплексное деление, вычисляет y1.imag*(y1.imag/y1.real). С y1.imag = 3.912055399093737e-161 в результате этого расчета получается денормализованное число, которое должно вызвать аннулирование FPE. Это комментарий, а не ответ, потому что я не знаю, почему другие расчеты не вызывают потерю значимости.   -  person Warren Weckesser    schedule 16.08.2017
comment
Я думаю, что это тот же вопрос, что и ваш: Пусть a = 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
comment
@WarrenWeckesser: Спасибо за комментарий! Да, это тоже может быть эквивалентно.   -  person user541686    schedule 16.08.2017
comment
Это может быть ошибка numpy. Давайте узнаем: github.com/numpy/numpy/issues/9568   -  person Warren Weckesser    schedule 16.08.2017
comment
Когда происходит недополнение? может помочь. Недополнение иногда связано не только с диапазоном, но и с точностью.   -  person chux - Reinstate Monica    schedule 17.08.2017