我很吃惊
>>> 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
对于所有n除了当n = 0
时结果为1
),并且可以扩展到涵盖为什么如果我们认为参数不必是有限的,那么math.nan*0
是nan
。
但是,如果这是幕后逻辑,那么0j**math.nan
应该是nan
,因为0j**n
对于所有的n
都是0
,除了n=0
,在这种情况下0j**0
为1
。那么... 0j**math.nan
是否有不同的推理?还是实现上出了问题?
1**NaN
)。 - jedwards0j**math.nan
=>pow(0j, complex(float('nan')))
. - Caramiriel**
运算的边缘情况,但没有详细查看复数的复杂pow
边缘情况。在一个采用 IEEE 754 双精度标准的系统上,浮点数使用普通的**
遵循各种标准(IEEE 754-2008、C99 附录 F 等)。复数的**
从未正确修复特殊值和边缘情况。 - Mark Dickinson