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

Подсказанный фрагментом более раннего кода, играющего в гольф, почему бы:

>NaN^0
[1] 1

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

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

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

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

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


person Simon O'Hanlon    schedule 25.07.2013    source источник
comment
Я не знаю для R, но то же самое происходит в Python на моей машине вместе с таким же неправильным: 1 ** nan возвращает 1.0   -  person hivert    schedule 26.07.2013
comment
@hivert, по крайней мере, в случае R ^ - это функция, которая не просто вызывает функцию C pow, она проверяет случай, когда основание равно 1 или показатель степени равен 0, и если любой из них равен TRUE, он возвращает 1. перед вызовом pow: if((x1 = INTEGER(s1)[i1]) == 1 || (x2 = INTEGER(s2)[i2]) == 0); REAL(ans)[i] = 1.;   -  person Simon O'Hanlon    schedule 26.07.2013
comment
Я тоже не уверен, что NA^0 == 1 имеет смысл, потому что Inf^0 — неопределенная форма. То есть, если рассматривать его как предел, мы не можем определить по одной только этой форме, каково было значение исходного предела. Например, когда n приближается к бесконечности, exp(n)^*(1/n) приближается к e, а n^(1/n) приближается к 1, хотя оба они выглядят как Inf^0.   -  person orizon    schedule 26.07.2013
comment
Просто комментарий по этому поводу: любое число, увеличенное до 0, даст 1, включая -Inf и Inf: для -Inf и +Inf значение должно быть NaN, так как это неопределенные пределы. Подумайте о (1 + 1/x)^x, когда x приближается к 0.   -  person Yves Daoust    schedule 31.07.2013


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

«NaN, с другой стороны, заражает любой расчет, который включает его. Если вычисление не будет давать тот же результат, независимо от того, какое реальное значение заменило NaN, результатом будет NaN».

Так что кажется, что разработчики GNU-C имеют в виду другой стандарт при написании своего кода. Сообщается, что версия стандарта с плавающей запятой ANSI/IEEE 754 от 2008 года содержит такое предложение:

http://en.wikipedia.org/wiki/NaN#Function_definition

Опубликованный стандарт не является бесплатным. Итак, если у вас есть права доступа или деньги, вы можете посмотреть здесь:

http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933

person IRTFM    schedule 25.07.2013
comment
Спасибо. Я решил принять это как ответ, потому что я думаю, что есть достаточно связанного чтения, которое, как вы указываете, отвечает дизайнерскому решению. Но документацию R по NaN, возможно, следует изменить на странице ?NaN, чтобы упомянуть, что операции с участием NaN всегда приводят к Na или NaN, за исключением случаев повышения до 0. Спасибо. - person Simon O'Hanlon; 25.07.2013
comment
... за исключением того, что в документации R может быть сказано, кроме возможно при повышении до нуля, в зависимости от платформы (мне не ясно из ответа, равно ли NaN^0 1 на всех возможных ОС со всеми возможными компиляторами. ..) - person Ben Bolker; 26.07.2013
comment
Я добавил примечание со страницы справки. (Конечно, я не собирался охватывать все возможные компиляторы.) И я бы сказал, что текущее поведение с компилятором GNU-C не соответствует Примечанию. - person IRTFM; 26.07.2013
comment
@BenBolker, к сожалению, ветка комментариев под OP стала слишком длинной и была полностью уничтожена. Но ранее указывалось, что если верить документации для ^, то: 1 ^ y и y ^ 0 равно 1, всегда. Но, возможно, это связано с тем, как R возводит в степень, как я указал в чате R, а не из-за компилятора стандарты. - person Simon O'Hanlon; 26.07.2013
comment
-1 по трем причинам. (1) Почему вы говорите о C? Это вопрос о R. (2) C не имеет даже имеет оператор в степени, поэтому то, что стандарт C говорит об операциях над NaN, не имеет значения. , даже если это был правильный язык. (3) Все, что вы здесь процитировали, похоже, указывает на то, что NaN^0 должно быть NaN, а не 0. Так что, даже если речь шла о правильном языке, как это отвечает на вопрос!? - person BlueRaja - Danny Pflughoeft; 26.07.2013
comment
@BlueRaja-DannyPflughoeft эквивалентная функция C - pow. Встроенная функция возведения в степень ^ в R вызывает pow через некоторые проверки переданных ей аргументов. NaN^0 эквивалентно в R `^`(NaN,0). См. мой комментарий ниже OP для исходного кода R (написанного на C), который выполняется до вызова pow. Я думаю, что DWin хорошо знаком с R. - person Simon O'Hanlon; 26.07.2013
comment
@BlueRaja-DannyPflughoeft: я начал поиск авторитетных описаний со страницы справки для «NaN». Это направило меня к стандарту IEEE. R написан на C, поэтому казалось возможным, что такой пограничный случай может быть определен на практике обычным поведением NaN с ^ в компиляторе GNU-C. Ответы бывают разными, часто историческими, как, например, в данном случае. - person IRTFM; 26.07.2013
comment
@DWin: я полагаю, что разработчики GNU-C имеют в виду стандарт C. :-) Приложение F C99 (в частности, F.9.4.4) явно дает эту рекомендацию: pow(x, ±0) возвращает 1 для любого x, даже NaN.. - person Mark Dickinson; 26.07.2013
comment
Между прочим, я думаю, что тег 'с плавающей запятой' имеет смысл для этого вопроса: есть много экспертов по плавающей запятой, которые могут дать окончательные ответы на то, что происходит на уровне C и IEEE 754 (но не обязательно на уровне R). - person Mark Dickinson; 26.07.2013
comment
В нем также говорится, что в R практически все математические функции (включая базовую «арифметику») должны правильно работать с «+/- Inf» и «NaN» в качестве ввода или вывода. Так что я думаю, что это ошибка в R - в частности, `NA ^ 0 == 1 определенно неправильно. - person hadley; 26.07.2013
comment
@MarkDickinson: добавлен тег для исключений с плавающей запятой. Я понимаю твою точку зрения, Хэдли. Хотите сообщить об ошибке? Ваша репутация в R Core, вероятно, намного выше моей. - person IRTFM; 26.07.2013
comment
@hadley Я не считаю, что NA^0==1 неправильно, потому что все элементы вектора в R должны быть одного типа. Я не могу ^ нечисловое NA (например, NA в векторе символов или просто NA_character_^0), R правильно говорит мне, что я предоставляю нечисловой аргумент. Однако концептуально в числовом векторе NA должно просто означать Я не знаю, что это за число, но это все же число, поэтому NA^0 должно всегда == 1. Концептуально я ничего не знаю о NaN, поэтому и возник вопрос. - person Simon O'Hanlon; 27.07.2013
comment
@SimonO101 SimonO101 Я не понимаю, почему класс элемента имеет значение: NA_real_ ^ 0 равен 1, что явно противоречит обычным правилам распространения отсутствующих значений: NA_real_ * 0 равно NA, а не 0. - person hadley; 28.07.2013
comment
@hadley NA_real_ * 0 должно быть NA, а не 0, потому что NA_real_ может представлять Inf, а Inf * 0 не определено (или NaN в языке R), поэтому оно может не быть 0, однако любое число ^ 0 равно 1, включая Inf и -Inf, поэтому всегда должно == 1. Единственный случай, который явно (на мой взгляд) неверен, это NaN ^ 0. - person Simon O'Hanlon; 30.07.2013
comment
Цитата GNU C в ответе: Unless the calculation would produce the same result no matter what real value replaced NaN, the result is NaN. OP: any number raised to 0 will give 1, including -Inf and Inf. Звучит подозрительно как действительное объяснение для меня. - person brichins; 31.07.2013
comment
@ SimonO101 А, это имеет смысл. Я не понял разницы в поведении между Inf ^ 0 и Inf * 0. - person hadley; 31.07.2013
comment
Я не понимаю, какой математически последовательный путь можно выбрать, чтобы сделать вывод, что Inf*0 не определено, а Inf^0 нет? - person eddi; 24.11.2013

Ответ можно резюмировать словами «по историческим причинам».

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

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

person eddi    schedule 25.07.2013
comment
Эту ссылку интересно читать. Мне бы хотелось, чтобы min и max R игнорировали NaN, но чтобы NaN^1 был NaN. Я не всегда могу получить то, что хочу. - person IRTFM; 25.07.2013
comment
Я считаю, что окончательная версия стандарта IEEE754-2008 на самом деле имеет как pow, так и powr, а также pown для возведения произвольного числа с плавающей запятой в целочисленную степень. pow(qNaN, 0) и pown(qNaN, 0) определяются как 1; powr(qNaN, 0) сигнализирует о недопустимом исключении операции и поэтому возвращает qNaN при обработке исключений FP по умолчанию. - person Mark Dickinson; 26.07.2013
comment
Очень интересное чтение по истории IEEE 754. Сохранение NaN имеет еще одно преимущество (для min/max или чего-то еще): NaN могло появиться в предыдущем вычислении, которое при других обстоятельствах дало бы полезное двойное значение, которое могло бы иметь был сравнен/использован/... Затем NaN рассматривается как исключительное значение и просто ошибка (по какой-то причине из-за переполнения вычисление пошло не так). Сохранение NaN позволяет хотя бы в итоге увидеть, что где-то была ошибка, а не даст молча неверный ответ. Сигнальные NaN также являются способом перехватить ошибку, когда она произойдет. - person ; 21.08.2013
comment
Концепция сохранения NaN практически идентична сохранению NA. Таким образом, в численных вычислениях NA и NaN всегда (?, вы можете найти исключение?) обрабатываются одинаково/аналогично. Подробнее в отдельном ответе ниже. Относительно sqrt(-1)^0: это точно хороший пример того, почему NaN^0 должен давать 1: sqrt(-1 + 0i)^0 действительно дает 1 (+0i): sqrt(-1+0i)^0 == 1 действительно TRUE - person Martin Mächler; 23.11.2013
comment
@MartinMächler, ты упускаешь суть. Допустим, я определяю свою собственную функцию, которая только определена на множестве [0,Inf) и не определена иначе: f = function(x) {if (x >= 0) x else NaN}. Ни в коем случае f(-1)^0 не будет равно 1, но R скажет вам, что это так. - person eddi; 23.11.2013
comment
@eddi: я не уверен, что вы имеете в виду под «Ни в коем случае f(-1)^0 не будет равно единице?» А как насчет того, что для целых степеней x^n определяется как единица, если n==0, (x^(n-1))*x, если n положительно, или (x^(n+1))/ х, если n отрицательно. Я никогда не видел никакого определения, в котором случай n == 0 требовал бы, чтобы x был определен. - person supercat; 23.11.2013
comment
@supercat в этом примере нет x, о котором вы говорите - я сделаю комментарий в вашем ответе, который может сделать его более понятным для вас. - person eddi; 24.11.2013

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

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

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

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

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

person Martin Mächler    schedule 23.11.2013
comment
лол, зачем кому-то соглашаться с тем, что NA^0 должен давать 1, если они думают, что NaN^0 не должен? NA является надмножеством NaN. Вы неправильно поняли направление if-else. - person eddi; 23.11.2013
comment
Ну, ОП именно это и сказал! - person Martin Mächler; 23.11.2013
comment
:) справедливо - оба должны знать лучше - person eddi; 23.11.2013
comment
и с какой стати было мое обобщающее замечание, от того единственного человека, который знал ответ на вопрос почему? потому что я участвовал в его реализации, я проголосовал против. .. небеса милостивые! - person Martin Mächler; 23.11.2013
comment
-1 от меня и в основном потому, что вы заявляете, что этот выбор хорош, без каких-либо аргументов в его поддержку. - person eddi; 24.11.2013
comment
по поводу вашего редактирования: нет, вы пропустили пункт дальше и все еще упускаете его - person eddi; 01.12.2013
comment
(В основном) для тех, кто читает это: NaN – это аббревиатура, а не число, и часто используется именно так, как не число, а вместо чего-то другого. Простым примером этого является as.numeric('blah'), который возвращает NaN. В этом случае использования NaN нет никакого смысла возвращать 1, несмотря на эту слабую попытку использовать ограничения для оправдания этого выбора. - person eddi; 01.12.2013

Вот одно рассуждение. Источник Goldberg:

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

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

Также обратите внимание:

> 1^NaN
[1] 1

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

person James    schedule 25.07.2013
comment
Итак, вы утверждаете, что они хотели избежать работы с особыми случаями? Но при вычислениях с плавающей запятой уже приходится иметь дело с рядом особых случаев, вызванных NaN (а также +/- Inf, +/- 0 и денормализованными числами), так что... - person BlueRaja - Danny Pflughoeft; 26.07.2013
comment
И если так случилось, что NaN был представлен, например, как 2, по вашей логике 1+NaN будет равно 3. Вы не можете делать выводы о том, каким должен быть тот или иной результат, исходя из того, как вы решили его представить. - person eddi; 23.11.2013

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

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

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

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

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

person supercat    schedule 25.07.2013
comment
NaN часто используется, например, для указать, что результат не находится в реальном домене, например. sqrt(-1). В вашей пользовательской функции это может быть что-то намного более экзотическое, чем комплексное число, для которого не обязательно даже определен оператор ^, и в этом случае будет неважно, какой вид нуля вы смотрите. - person eddi; 23.11.2013
comment
@eddi: Если семантическое значение x^literalZero определяется как игнорирование x и возврат 1, то правильный результат sqrt(-1)^0 должен быть 1. Можно задаться вопросом, является ли это наиболее желательным способом определения оператора возведения в степень, но я бы сказал, что языки следует избегать определения крайних случаев, обработка которых потребует дополнительного кода. Между прочим, отличает ли язык, который вы используете, случаи, когда правый оператор представляет собой целое число, от случаев, когда он представляет собой число с плавающей запятой? В некоторых языках (-2.0)^2 равно 4.0, но (-2.0)^(2.0) недействительно. Если ноль - целое число... - person supercat; 23.11.2013
comment
... тогда я не думаю, что обработка NaN IEEE-754 будет актуальной (поскольку в ней не упоминается возведение в степень по целому числу), и я бы не одобрил требование языка кодировать нулевой регистр как if (exponent==0) return (isNan(base) ? NaN : 1.0);, а не просто if (exponent==0) return 1;. - person supercat; 23.11.2013
comment
Возьмем функцию f = function(x) {if (x > 0) x else "boo"}. Тогда f(-1)^0 правильно выдаст вам ошибку. Теперь представьте, что кто-то хочет представить эту функцию в домене только для вещественных чисел. Как бы они это сделали: f_real = function(x) {if (x > 0) x else NaN}. И R продолжал бы давать неправильный ответ, когда они пытались сделать f_real(-1)^0. - person eddi; 24.11.2013
comment
@eddi: Вы имеете в виду f_real(-1)^0 или f_real^0.0? Я бы сказал, что математически f(x)^N можно определить как {1, когда N=0, (f(x)^(N-1))*f(x), когда N > 0, и (f(x )^(N+1)) при N ‹ 0}. Таким образом, требуется, чтобы функция оценивалась abs(N) раз; поскольку в математике нет понятия функций с побочными эффектами, вычисление функции abs(N) раз эквивалентно ее вычислению ровно один раз, при условии, что вас волнует только то, что произойдет, если вы действительно используете результат. Обратите внимание, что мое несогласие распространяется только на случай, когда показатель степени равен нулю. Кстати, я ошибся насчет IEEE, а не... - person supercat; 25.11.2013
comment
... определение степенной функции для целого числа N. На самом деле она определяет три степенные функции, одна из которых предполагает целое число N и сообщает, что NaN^0 равно 1,0; остальные используют реальный N и отличаются своим поведением для NaN^0.0. Любопытно, что они определили две формы real^real, но не две формы сравнения, учитывая, что во многих ситуациях наиболее важной характеристикой для операторов == и != было бы то, что они должны определять отношение эквивалентности. - person supercat; 25.11.2013
comment
совершенно неважно, до какой степени вы хотите взять f_real(-1), включая 0, что вы называете 0,0 или 10. Во всех случаях ответ должен быть один - должно быть NaN. Операция с целым числом 0, которую вы хотите определить и можете свободно выполнять, просто не определена для строк (и для некоторых других пользовательских классов она вполне может быть определена , но дает другой результат) и это то, что здесь означает NaN и что R портит. Повторюсь: определяемая вами операция только определена для вещественных чисел, а NaN охватывает не только вещественные числа. - person eddi; 25.11.2013

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

РЕДАКТИРОВАТЬ:

Например, если вы должны были взять 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 просто исчезает из существования.

person Lochemage    schedule 25.07.2013
comment
Так вы в основном говорите, что не число является числом? - person ; 25.07.2013
comment
@H2CO3 Согласно R, да, потому что is.numeric(NaN) равно TRUE - person dickoa; 25.07.2013
comment
@dickoa Я думаю, вопрос в том, должно ли это быть?! - person Simon O'Hanlon; 25.07.2013
comment
@ SimonO101 Это очень интересный вопрос, и я действительно не знаю, каким он должен быть на этом уровне ... все еще думаю о плюсах и минусах. - person dickoa; 25.07.2013
comment
@DanielFischer Я знаю, и float f = NAN;... но все же... Если что-то не число, то это не число. (И минусы по-прежнему не мои...) - person ; 25.07.2013
comment
Почему минусы? Я не считаю этот ответ особенно бесполезным или, что еще хуже, неверным - person Simon O'Hanlon; 25.07.2013
comment
@H2CO3 Я знаю, ты знаешь. Просто немного невинного веселья. - person Daniel Fischer; 25.07.2013
comment
@DanielFischer Это разрешено, я ни в коем случае не против :) - person ; 25.07.2013
comment
нет, я говорю, что NaN имеет числовой тип, это просто не конкретное значение, которое может быть представлено определенным числовым значением. Обычно вы получаете это значение после выполнения математической операции над некоторыми числами, которую невозможно решить с конкретным числовым результатом. Ответ по-прежнему число, просто это не число, которое может быть представлено - person Lochemage; 25.07.2013
comment
Например, если вы должны были взять 0/0. Что в итоге? Если вы попытаетесь решить это уравнение на бумаге, вы застрянете на самой первой цифре, сколько нулей вписывается в другой 0? Можно поставить 0, можно поставить 1, можно поставить 8, все они укладываются в 0, но невозможно узнать, какой из них правильный. Ответ по-прежнему является числом, но не конкретным, которое кто-либо может представить. - person Lochemage; 25.07.2013
comment
этот ответ (особенно редактирование) - полная ерунда, не имеющая ничего общего с математикой - person eddi; 25.07.2013
comment
@eddi Мне бы очень хотелось, чтобы кто-нибудь просто написал ответ, в котором говорится, что R следует стандарту X, и это то, что говорит стандарт, поэтому мы все можем проголосовать за это и покончить с этим. - person joran; 25.07.2013
comment
@joran согласился в смысле ответа на ОП, но не обязательно на концептуальные вопросы, лежащие в его основе. - person eddi; 25.07.2013
comment
@joran: Ну, я не уверен, какие гарантии дает R в отношении соблюдения каких-либо стандартов, но доминирующим стандартом в этой области является IEEE 754, и в нем говорится (в разделе 9.2.1): pow (x, ± 0) is 1 для любого x (даже нуля, спокойного NaN или бесконечности). Из формулировки стандарта мне не на 100% ясно, является ли это рекомендацией или требованием. - person Mark Dickinson; 25.07.2013
comment
Существует разница между неизвестным числом и ошибкой, т. е. таким выражением, как 0/0, которое не представляет действительное число. NaN предназначен для второго случая. - person Ferdinand.kraft; 25.07.2013