为什么NaN ^ 0 == 1

Sim*_*lon 64 math r arithmetic-expressions

由早期代码打高尔夫提示为什么会:

>NaN^0
[1] 1
Run Code Online (Sandbox Code Playgroud)

它非常有意义的NA^0是1,因为NA丢失数据,以及任何升至0号将为1,包括-InfInf.但是NaN应该代表非数字,为什么会这样呢?当?NaN州的帮助页面时,这更令人困惑/担忧:

在R中,基本上所有数学函数(包括基本算术)都应该与+/- Inf和NaN一起作为输入或输出正常工作.

基本规则应该是呼叫和与Infs的关系确实是具有适当数学限制的陈述.

涉及NaN的计算将返回NaN或NA:这两者中的哪一个不能保证并且可能依赖于R平台(因为编译器可能重新排序计算).

这背后有一个哲学原因,还是仅仅与R代表这些常数有关?

42-*_*42- 27

这在引用的帮助页面中引用 ?'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.
Run Code Online (Sandbox Code Playgroud)

它可能来自特定的C编译器,如您引用的注释所示.这就是GNU C文档所说的:

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

"另一方面,NaN会感染任何涉及它的计算.除非计算产生相同的结果,无论实际值是否取代NaN,结果都是NaN."

因此,在编写代码时,GNU-C人员似乎有不同的标准.据报道,2008版ANSI/IEEE 754浮点标准提出了这样的建议:

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

公布的标准不是免费的.因此,如果您有访问权限或金钱,您可以在这里查看:

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


edd*_*ddi 19

答案可以归结为"出于历史原因".

看来,IEEE 754推出了两款不同功率的功能 - pow以及powr,与后者保持NaN在OP情况的,也回来NaNInf^0,0^0,1^Inf,但最终因为后者被丢弃在这里简要说明.

从概念上讲,我是在NaN保留营地,因为我是从限制的角度来看这个问题,但从便利的角度来看,我希望目前的约定稍微容易处理,即使他们没有做很多事情.在某些情况下感觉(例如sqrt(-1)^0,等于1,而所有操作都在实数上,如果有的话,则没有意义).


Mar*_*ler 15

是的,我已经迟到了,但作为参与此设计的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 就是正确的结果.


Jam*_*mes 5

这是一个推理.来自Goldberg:

在IEEE 754中,NaN通常表示为具有指数e_max + 1和非零有效数的浮点数.

NaN浮点数也是如此,但具有特殊含义.将数字增加到幂零将其指数设置为零,因此它将不再是NaN.

另请注意:

> 1^NaN
[1] 1
Run Code Online (Sandbox Code Playgroud)

一个是指数为零的数字.