Удивление с 1 ** math.nan и 0j ** math.nan
Я удивлен, что
>>> import math
>>> 1**math.nan
1.0
И пока мы на нем, также, что
>>> 0j**math.nan
0j
Я не нашел других примеров. Есть ли причина или какая-то логика, которую я пропустил, что делает это правильным выбором? Или это промах?
Я ожидал nan
. Что касается любого другого номера, кроме 1
или 0j
.
Редактировать 1: Благодаря комментарию jedwards ниже у меня есть ссылка. Но я до сих пор не понимаю, почему. Почему это было принято в качестве стандарта? Кроме того, не удалось найти ссылку на 0j**mat.nan
...
Изменить 2: Итак, следуя приведенным ниже ответам и некоторым другим материалам, логика может быть такой: любой расчет, включающий nan
, должен возвращать nan
, если вычисление всегда возвращает тот же ответ независимо от аргументов. В таких случаях тот факт, что мы имеем nan
в качестве аргумента, не должен влиять на результат, и мы должны получить фиксированный ответ.
Это, безусловно, объясняет 1**math.nan
и math.nan**0
. Это также объясняет, почему 0**math.nan
дает nan
, а не 0
(так как 0**n
есть 0
для всех, но если n=0
, где он получается с помощью 1
), и может быть растянут, чтобы покрыть почему math.nan*0
nan
, если мы согласны с тем, что аргумент не обязательно конечен.
Но если это логика сцены, тогда 0j**math.nan
должен был быть nan
, так как 0j**n
- 0
для всех n
кроме n=0
, где 0j**0
- 1
. Итак... у 0j**math.nan
есть разные рассуждения? или это проблема в реализации?
Ответы
Ответ 1
Цитируя этот question, который, по очереди, цитирует IEEE 754 (см. Wikipedia),
В версии стандарта IEEE 754 2008 года говорится, что pow (1, qNaN) и pow (qNaN, 0) должны возвращать 1, так как они возвращают 1, все остальное используется вместо спокойного NaN.
Подробнее см. стр. 56 из IEEE 754 2008:
pow (x, ± 0) равно 1 для любого x (даже нулевого, спокойного NaN или бесконечности)
pow (± 0, y) равно ± ∞ и сигнализирует исключение divideByZero для y нечетное
Таким образом, рассуждения кажутся, что независимо от того, какое число k находится в показателе, 1^k = 1
, 1^Nan
также должно быть 1. Почему это рассуждение разумно (я уверен, что это так) мне нужно копать дальше.
Лично я думаю, что это имеет смысл - Nan
на самом деле не существует в математике, это просто то, что наше представление с плавающей запятой не может справиться с ним (или, Nan - это "вычисление слишком много", это некоторый номер но не уверен, что "). Таким образом, 1^Nan
может быть равным 1 произвольной мощности (не 1 для чего-то, что не является числом), но так как ответ всегда равен 1, это может помочь, если мы определим 1^Nan
как 1.