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

Python 1**math.nan和0j**math.nan的惊喜,python,floating-point,nan,ieee-754,Python,Floating Point,Nan,Ieee 754,我很惊讶 >>> import math >>> 1**math.nan 1.0 当我们这样做的时候 >>> 0j**math.nan 0j 我没有找到其他的例子。有什么原因或逻辑让我错过了,使这成为正确的选择?还是这是一个失误 我期待着nan。对于除1或0j以外的每一个数字 编辑1:感谢jedwards在下面的评论,我有一个参考。但我还是不明白为什么。为什么这被定为标准?此外,找不到对0j**mat.nan的引用 编辑2:因此,根据下面

我很惊讶

>>> 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
),如果我们同意参数不需要是有限的,那么可能会延伸到为什么
math.nan*0
nan

但是如果这是幕后的逻辑,那么
0j**math.nan
应该是
nan
,因为
0j**n
对于所有
n
而言都是
0
,除了
n=0
其中
0j**0
1
。所以
0j**math.nan
是否有不同的推理?或者这是实施中的一个问题?

引用了IEEE 754(参见)

IEEE754标准的2008版本规定,pow(1,qNaN)和pow(qNaN,0)都应该返回1,因为它们返回1,无论使用什么,而不是安静的NaN

有关详细信息,请参见第56页,共页:

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

功率(±0,y)为±∞ 并发出y为奇数的除零异常信号

因此,推理似乎是,无论指数中的数字k是什么,
1^k=1
1^Nan
也应该是1。为什么这个推理是合理的(我相信是的),我还需要进一步挖掘


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

Nan**0==1你的列表的另一个惊喜是我错认为它是IEEE-754,看起来它是附录F(
1**NaN
在F.9.44中有规定,例如)522页的浅睡前阅读相关:-
0j**math.NaN
=>
pow(0j,复数(float('NaN'))
简单回答:Python开发人员花了大量时间在浮点上正确处理
***
,但没有人详细研究复杂的
pow
角情况。在具有IEEE 754双工的系统上,用于浮点的普通老式
***
遵循各种标准(IEEE 754-2008,C99附录F等).complex的
**
对于特殊值和特殊情况,从来没有被正确地修复过。事实上,我知道为什么这样做是有意义的。但是
0j**math.nan
呢?@Aguy:我认为这是一个错误,因为0**float('nan')=nan。这看起来像是非法分发的IEEE 754的PDF文件-(@MarkDickinson:它看起来像是课堂材料,所以我认为它可能是合法的——不过,如果你确定它是非法的,请随意编辑。无论如何,它总是离谷歌很近。