令人惊讶的是1 ** math.nan和0j ** math.nan

时间:2016-07-31 15:52:36

标签: python floating-point nan ieee-754

我很惊讶

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

虽然我们也是,但那

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

我没有找到任何其他例子。是否有一个我错过的理由或逻辑使得这个选择成为正确的选择?或者这是一个滑倒?

我期待nan。至于除10j之外的其他所有数字。

编辑1:感谢jedwards的评论,我有一个参考。但我仍然不明白为什么。为什么这个决定作为标准?另外,找不到对0j**mat.nan ...

的引用

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

这肯定解释了1**math.nanmath.nan**0。这也解释了0**math.nan给出nan而不是0的原因(因为0**n 0n=0,但1math.nan*0结果为nan 1}}),如果我们同意论证不必是有限的,可能会被拉伸以涵盖0j**math.nannan的原因。

但如果这是场景背后的逻辑,那么0j**n应该是0,因为n对于所有n=0都是0j**0,除了1 0j**math.nan let lineDelta: number = ... let endPos = startPos.translate(lineDelta, error.location.length); let characterDelta: number = ... let endPos = startPos.translate({ characterDelta: characterDelta, lineDelta : error.location.length }); 。那么...... startPos.translate(); startPos.translate(lineDelta); startPos.translate(lineDelta, characterDelta); 有不同的推理吗?或者这是实施中的问题?

1 个答案:

答案 0 :(得分:6)

引用此question引用IEEE 754(参见Wikipedia),

  

2008版IEEE 754标准规定,pow(1,qNaN)和pow(qNaN,0)都应该返回1,因为它们返回1而不是使用其他任何用于安静的NaN。

有关详细信息,请参阅IEEE 754 2008的第56页:

  对于任何x(即使是零,安静的NaN或无穷大),

pow(x,±0)为1

     

pow(±0,y)是±∞并且表示divideByZero异常为y奇数

因此,推理似乎是无论指数中的k是多少,1^k = 11^Nan也应该是1.为什么推理是合理的(我确定是)我需要进一步挖掘。

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