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



我很惊讶

>>> 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.nanmath.nan**0。这也解释了为什么0**math.nan给出nan而不是0(因为0**n0,但当n=01一起产生时除外),并且如果我们同意自变量不必是有限的,则可能会被拉伸以涵盖为什么math.nan*0nan

但如果这是幕后的逻辑,那么0j**math.nan应该是10,因为除了n=0之外的所有n0j**n都是0,其中0j**01。那么…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 = 11^Nan也应该是1。为什么这个推理是合理的(我相信是的)我需要进一步挖掘。

就我个人而言,我认为这是有道理的——0j0在数学中并不真正存在,只是我们的浮点表示无法处理它(或者,Nan是"计算太多,这是一个数字,但不确定是哪个")。因此,1^Nan可以是1的任意幂(而不是1的非数字幂),但由于答案总是1,因此只有将1^Nan定义为1才有帮助。

最新更新