我很惊讶
>>> 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
时),并且可能被拉伸(stretch)以涵盖为什么 math.nan* 0
是 nan
如果我们同意参数不需要是有限的。
但如果这是幕后逻辑,那么 0j**math.nan
应该是 nan
,因为 0j**n
对于所有 n
都是 0
,除了 n=0
其中 0j**0
是 1
。那么... 0j**math.nan
有不同的推理吗?还是执行上的问题?
最佳答案
引用此 question依次引用 IEEE 754(参见 Wikipedia),
The 2008 version of the IEEE 754 standard says that pow(1,qNaN) and pow(qNaN,0) should both return 1 since they return 1 whatever else is used instead of quiet NaN.
有关详细信息,请参阅 IEEE 754 2008 的第 56 页:
pow(x, ±0) is 1 for any x (even a zero, quiet NaN, or infinity)
pow(±0, y) is ±∞ and signals the divideByZero exception for y an odd
因此,推理似乎是无论指数中的 k 是什么数,1^k = 1
,1^Nan
也应该是 1。为什么这个推理是合理的(我敢肯定)我需要进一步挖掘。
我个人认为这是有道理的——Nan
在数学中并不真正存在,只是我们的浮点表示无法处理它(或者,Nan 是“计算太多了” ,这是一些数字,但不确定是哪个”)。因此,1^Nan
可以是 1 的任意次幂(不是 1 的非数字),但由于答案始终为 1,因此只有定义 才有帮助1^Nan
为 1。
关于python - 1**math.nan 和 0j**math.nan 的惊喜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685737/