Почему 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 ответов:
на это ссылается страница справки, на которую ссылается
?'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
просто исчезает из существования.