如何处理Python中的不确定型

3 投票
2 回答
672 浏览
提问于 2025-04-17 23:08

在我的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.0y=-inf+1.0j,那么结果会包含 nan,因为 inf*0 是不确定的。我想要一种方法,让Python在进行乘法时,能够返回 -inf+1.0j 这样的结果。似乎不需要我自己定义一个乘法运算符(比如通过一个函数 cmultiply(x,y))来得到我想要的结果。

2 个回答

3

简单来说,C99标准(附录G)在处理复数运算时只承认一个复数无穷大(可以想象成:黎曼球面)。(inf, nan) 是它的一种表示方式,而 (-inf, 6j) 则是另一种等价的表示方式。

2

如果我使用 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)

我不建议你尝试去“处理” infnan。你可以通过 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

撰写回答