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:它看起来像是课堂材料,所以我认为它可能是合法的——不过,如果你确定它是非法的,请随意编辑。无论如何,它总是离谷歌很近。