令人惊讶的是1**math.nan和0j**math.nan

Agu*_*guy 12 python floating-point nan ieee-754

我很惊讶

>>> import math
>>> 1**math.nan
1.0
Run Code Online (Sandbox Code Playgroud)

虽然我们也是这样,但也是如此

>>> 0j**math.nan
0j
Run Code Online (Sandbox Code Playgroud)

我没有找到任何其他例子.是否有一个我错过的理由或逻辑使得这个选择成为正确的选择?或者这是一个滑倒?

我在期待nan.至于除了1或之外的其他所有数字0j.

编辑1:感谢jedwards的评论,我有一个参考.但我仍然不明白为什么.为什么这个决定作为标准?另外,找不到参考0j**mat.nan......

编辑2:所以按照下面的答案和其他一些东西,逻辑可能是这样的:任何涉及的计算都nan应该返回,nan除非计算总是返回相同的答案而不管参数.在这种情况下,我们nan作为论据的事实不应该影响结果,我们仍然应该得到固定的答案.

这当然解释1**math.nanmath.nan**0.这也解释了为什么0**math.nannan,而不是0(因为0**n0为所有,但,当n=0它与结果1),并可能被展宽到为什么math.nan*0nan如果我们同意该说法不一定是有限的.

但如果这是现场背后的逻辑,那么0j**math.nan应该是nan,因为0j**n0对所有n除的n=0地方0j**01.所以...确实0j**math.nan有不同的推理?或者是实施中的问题?

zw3*_*324 6

引用这个问题反过来引用IEEE 754(见维基百科),

2008版IEEE 754标准规定,pow(1,qNaN)和pow(qNaN,0)都应该返回1,因为它们返回1,而不是使用其他任何用于安静的NaN.

有关详细信息,请参阅IEEE 754 2008的第56页:

对于任何x(即使是零,安静的NaN或无穷大),pow(x,±0)为1

pow(±0,y)是±∞,并且y为奇数,表示divideByZero异常

因此,推理似乎是无论指数中的数字k是多少1^k = 1,1^Nan也应该是1.为什么推理是合理的(我确定它是)我需要进一步挖掘.

就个人而言,我认为这是有道理的 - Nan在数学中并不存在,只是我们的浮点表示无法处理它(或者,Nan是"计算太多,这是一些数字但不确定哪个") .因此,1^Nan可以是1到任意幂(不是1到非数字的东西),但由于答案总是1,所以只有在我们定义1^Nan为1时它才有用.