如何处理Python中的不确定型
在我的Python脚本中,有一个地方需要进行这样的计算:1*(-inf + 6.28318530718j).
我知道这个计算会返回 -inf + nan*j
,因为 1
的虚部显然是 0
。但是我希望这个乘法的结果能返回 -inf + 6.28318530718j
,这才是我期待的结果。我还希望这个解决方案能适用于任何类似的乘法情况。有没有什么好主意?
补充:
在Python中,像 x*y
这样的复数乘法,其中 x = (a+ib)
和 y = (c+id)
,我认为是通过 (x.real*y.real-x.imag*y.imag)+1j*(x.real*y.imag+x.imag*y.real)
来处理的,因为这就是数学上乘法的结果。如果说 x=1.0
和 y=-inf+1.0j
,那么结果会包含 nan
,因为 inf*0
是不确定的。我想要一种方法,让Python在进行乘法时,能够返回 -inf+1.0j
这样的结果。似乎不需要我自己定义一个乘法运算符(比如通过一个函数 cmultiply(x,y)
)来得到我想要的结果。
2 个回答
简单来说,C99标准(附录G)在处理复数运算时只承认一个复数无穷大(可以想象成:黎曼球面)。(inf, nan)
是它的一种表示方式,而 (-inf, 6j)
则是另一种等价的表示方式。
如果我使用 np.log(0)
,我会收到一个警告,内容大致是:
>>> 1*(np.log(0) + 6.28318530718j)
__main__:1: RuntimeWarning: divide by zero encountered in log
__main__:1: RuntimeWarning: invalid value encountered in cdouble_scalars
(-inf+nan*j)
我不建议你尝试去“处理” inf
和 nan
。你可以通过 numpy.seterr
来改变 numpy 的行为:
>>> np.seterr(divide='raise')
{'over': 'warn', 'divide': 'raise', 'invalid': 'warn', 'under': 'ignore'}
>>> 1*(np.log(0) + 6.28318530718j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FloatingPointError: divide by zero encountered in log
这样你就可以捕捉到 FloatingPointError
这个错误,并以某种有用的方式来处理它。
需要注意的是,原答案中的 nan
实际上是 inf
的一个副作用。如果你这样做:
>>> 1*(2 + 6.28318530718j)
(2+6.28318530718j)
如果乘法的一部分没有复杂的成分,它不会在另一边产生 nan
。