我很惊讶
>>> import math
>>> 1**math.nan
1.0
当我们在做的时候,
>>> 0j**math.nan
0j
我没有找到其他的例子。有没有什么原因或逻辑让我错过了,这才是正确的选择?还是这是个失误?
我期待nan
。对于除CCD_ 2或CCD_。
编辑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
应该是1
0,因为除了n=0
之外的所有n
的0j**n
都是0
,其中0j**0
是1
。那么…0j**math.nan
有不同的推理吗?还是在实施中存在问题?
引用这个问题,这个问题又引用了IEEE 754(参见维基百科),
IEEE 754标准的2008版本规定pow(1,qNaN)和pow(qNaN,0)都应该返回1,因为无论使用什么,它们都返回1,而不是安静的NaN。
有关详细信息,请参阅IEEE 754 2008:第56页
pow(x,±0)对于任何x(即使是零、安静的NaN或无穷大)都是1
pow(±0,y)为±∞,并表示y为奇数的divideByZero异常
因此,推理似乎是,无论指数中的数字k是多少,1^k = 1
、1^Nan
也应该是1。为什么这个推理是合理的(我相信是的)我需要进一步挖掘。
就我个人而言,我认为这是有道理的——0j
0在数学中并不真正存在,只是我们的浮点表示无法处理它(或者,Nan是"计算太多,这是一个数字,但不确定是哪个")。因此,1^Nan
可以是1的任意幂(而不是1的非数字幂),但由于答案总是1,因此只有将1^Nan
定义为1才有帮助。