python - 1**math.nan 和 0j**math.nan 的惊喜

标签 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**n0 对于所有但当 n=0 结果为 1 时),并且可能被拉伸(stretch)以涵盖为什么 math.nan* 0nan 如果我们同意参数不需要是有限的。

但如果这是幕后逻辑,那么 0j**math.nan 应该是 nan,因为 0j**n 对于所有 n 都是 0,除了 n=0 其中 0j**01 。那么... 0j**math.nan 有不同的推理吗?还是执行上的问题?

最佳答案

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

The 2008 version of the IEEE 754 standard says that pow(1,qNaN) and pow(qNaN,0) should both return 1 since they return 1 whatever else is used instead of quiet NaN.

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

pow(x, ±0) is 1 for any x (even a zero, quiet NaN, or infinity)

pow(±0, y) is ±∞ and signals the divideByZero exception for y an odd

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

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

关于python - 1**math.nan 和 0j**math.nan 的惊喜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685737/

相关文章:

floating-point - 两个不相等的 float 相减是否可以得到0?

c++ - 从 Matlab 调用的 Mex 函数和数值差

python - 如何从生成器或列表中获取前 N 个项目?

python - 递归地从元组中删除元素

python - 在 Heroku 中安装 Python 依赖项

python - ffill 不在 pandas dataframe 中填充数据

objective-c - isNan( ) 是如何工作的?

python - 重复类实例化和赋值的紧凑形式

计算最接近的浮点值

javascript - 为什么/如何阻止它返回 NaN?