Почему NaN^0 == 1


подсказано пятном более раннего кода гольф почему бы:

>NaN^0
[1] 1

для NA^0 должен быть 1, потому что NA отсутствуют данные, и любой число, поднятое до 0, даст 1, включая -Inf и Inf. Однако NaN должен представлять not-a-number, так почему же это так? Это еще более запутанно / тревожно, когда страница справки для ?NaN гласит:

в R, в основном все математические функции (включая основные Арифметика), должны работать правильно с + / - Inf и NaN как вход или выход.

основное правило должно заключаться в том, что звонки и отношения с Infs действительно есть утверждения с правильным математическим пределом.

вычисления с участием NaN вернут NaN или, возможно, NA: какой из эти два не гарантируется и может зависеть от платформы R (так как компиляторы могут изменить порядок вычисления.)

есть ли философская причина за этим, или это просто связано с тем, как R представляет эти константы?

6 63

6 ответов:

на это ссылается страница справки, на которую ссылается ?'NaN'

" стандарт IEC 60559, также известный как стандарт ANSI / IEEE 754 с плавающей запятой.

http://en.wikipedia.org/wiki/NaN."

и там вы найдете это утверждение относительно того, что должно создать NaN:

 "There are three kinds of operations that can return NaN:[5]
       Operations with a NaN as at least one operand.

вероятно, это из конкретного компилятора C, как указано в примечании, на которое вы ссылаетесь. Вот что такое документация GNU C говорит:

http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

ответ может быть суммирован "по историческим причинам".

кажется, что IEEE 754 ввел два различные функции питания -pow и powr, с сохранением последнего NaN ' s в случае OP, а также возвращение NaN на Inf^0,0^0,1^Inf, но в конце концов последний был отброшен как кратко объяснил здесь.

концептуально, я в NaN сохранение лагеря, потому что я иду на вопрос из с точки зрения ограничений, но с точки зрения удобства я ожидаю, что с текущими соглашениями немного легче иметь дело, даже если они не имеют большого смысла в некоторых случаях (например,sqrt(-1)^0 быть равным 1, в то время как все операции выполняются на вещественных числах, имеет мало смысла, если таковые имеются).

Да, я опаздываю здесь, но как член R Core, который участвовал в этом дизайне, позвольте мне вспомнить, что я прокомментировал выше. Сохранение NaN и сохранение NA работают "эквивалентно" в R, поэтому, если вы согласны с тем, что NA^0 должен давать 1, NaN^0 |-> 1 является следствием.

действительно (как говорили другие) вы должны действительно читать страницы справки R, а не C или Стандарты IEEE, чтобы ответить на такие вопросы, и Симоно101 правильно процитировал

1 ^ y и y ^ 0 равны 1, всегда

и я почти уверен, что я был сильно вовлечен (если не автор) этого. Обратите внимание, что это хороший, неплохо, чтобы иметь возможность предоставлять ответы, отличные от NaN, также в случаях, когда другие языки программирования делают по-другому. Следствием такого правила является то, что больше вещей работают автоматически правильно; в другом случае программисту R было бы предложено сделать более Специальный корпус самостоятельно.

или по-другому, простое правило, как указано выше (возвращение non-NaN во всех случаях) является хорошим правилом, потому что оно распространяет непрерывность в математическом смысле: lim_x f(x) = f(lim x). У нас было несколько случаев, когда это было явно adavantageous (т. е. не нуждалось в специальном корпусе, я повторяю..) придерживаться вышеуказанного правила "= 1", а не распространять NaN. Как я уже сказал далее, sqrt (-1)^0 также является таким примером, как 1 и правильный результат, как только вы выходите на сложную плоскость.

вот одно рассуждение. От Гольдберг:

в IEEE 754 NaNs часто представлены в виде чисел с плавающей запятой с показатель степени e_max + 1 и ненулевые значения.

Так NaN - это число с плавающей запятой, хотя и с особым значением. Повышение числа до нулевой степени устанавливает его экспоненту в ноль, поэтому он больше не будет NaN.

обратите внимание:

> 1^NaN
[1] 1

один-это число, показатель которого равен уже ноль.

концептуально, единственная проблема с NaN^0 == 1 Это то, что нулевые значения могут быть получены по крайней мере четырьмя различными способами, но формат IEEE использует одно и то же представление для трех из них. Приведенная выше формула равенства имеет смысл для наиболее распространенного случая (который является одним из трех), но не для остальных.

кстати, четыре случая, которые я бы узнал, были бы:

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

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

если с плавающей точкой признали выше, было бы полезно рассматривать повышение Нана в буквальном ноль, поскольку дает один и, подняв его на любой другой вид ноль как урожайность Нана; такая норма позволила бы постоянный результат, предполагал, что во многих случаях то, что может быть Нана будут повышены, то компилятор может определить как постоянный ноль, и без такого предположения, изменяя семантику программы. В противном случае, я думаю проблема в том, что большинство кода не будет заботиться о том,x^0 могло бы NaN Если x - это NaN, и нет особого смысла в том, чтобы компилятор добавлял код для условий, о которых код не будет заботиться. Обратите внимание, что проблема заключается не только в коде для вычисления x^0, но для любых вычислений, основанных на том, что было бы постоянным, если x^0 было.

если вы посмотрите на тип NaN, это все еще число, это просто не конкретное число, которое может быть представлено числовым типом.

EDIT:

например, если вы должны были взять 0/0. Каков же результат? Если вы попытались решить это уравнение на бумаге, вы застряли на самой первой цифре, сколько нулей вписывается в другой 0? Вы можете поставить 0, вы можете поставить 1, вы можете поставить 8, все они вписываются в 0*x=0, но невозможно узнать, какой из них правильный ответ. Однако, это не означает, что ответ больше не является числом, это просто не число, которое можно представить.

независимо от того, любое число, даже число, которое вы не можете представить, в нулевой степени равно 1. Если вы сломаете некоторые математики x^8 * x^0 может быть дополнительно упрощен x^(8+0) что составляет x^8, откуда x^0 идти? Это имеет смысл, если x^0 = 1 потому что тогда уравнение x^8 * 1 объясняет, почему x^0 просто исчезает из существования.