1**math.nan 和 0j**math.nan 的惊喜

A surprise with 1**math.nan and 0j**math.nan

我很惊讶

>>> import math
>>> 1**math.nan
1.0

当我们这样做的时候,

>>> 0j**math.nan
0j

我没有找到任何其他示例。是否有我错过的原因或逻辑使它成为正确的选择?或者这是一个失误?

我期待 nan。至于除 10j.

以外的所有其他数字

编辑 1: 感谢 jedwards 在下面的评论,我有一个参考。但我还是不明白为什么。为什么将其定为标准?此外,找不到对 0j**mat.nan...

的引用

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

这当然解释了1**math.nanmath.nan**0。这也解释了为什么 0**math.nan 给出 nan 而不是 0(因为 0**n 对所有人来说都是 0,但当 n=0 结果为 1),如果我们同意论证不必是有限的,则可能会延伸到涵盖为什么 math.nan*0nan

但如果这是幕后的逻辑,那么 0j**math.nan 应该是 nan,因为 0j**n 对所有 n 都是 0' s 除了 n=0,其中 0j**01。那么... 0j**math.nan 有不同的推理吗?还是执行有问题?

引用此 question which in turns quotes IEEE 754 (see 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 = 11^Nan也应该是1。为什么这个推理是合理的(我敢肯定是)我需要进一步挖掘。

我个人认为这是有道理的 - Nan 在数学中并不存在,只是我们的浮点表示无法处理它(或者,Nan 是“计算量太大,这是一些数字,但不确定是哪个”)。因此,1^Nan 可以是 1 的任意次幂(不是 1 的非数字),但由于答案始终为 1,因此只有将 1^Nan 定义为 1 才有用.