Подтвердить что ты не робот

Удивление с 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 есть разные рассуждения? или это проблема в реализации?

4b9b3361

Ответ 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.