4

有关一些背景信息,请参阅此问题。我在那个问题上的主要问题已经解决了,有人建议我问另一个我遇到的第二个问题:

print cubic(1, 2, 3, 4)  # Correct solution: about -1.65
...
    if x > 0:
TypeError: no ordering relation is defined for complex numbers
print cubic(1, -3, -3, -1)  # Correct solution: about 3.8473
    if x > 0:
TypeError: no ordering relation is defined for complex numbers

具有一个实根和两个复根的三次方程收到错误,即使我使用 cmath 模块并定义了立方根函数来处理复数。为什么是这样?

4

2 回答 2

10

Python 的错误消息非常好,就像这些事情一样:与我提到的某些语言不同,它们感觉不像是随机的字母集合。所以当 Python 抱怨比较时

if x > 0:

TypeError: no ordering relation is defined for complex numbers

你应该相信它的话:你试图比较一个复数x以查看它是否大于零,而 Python 不知道如何对复数进行排序。是2j > 0吗?是-2j > 0吗?等等。面对模棱两可,拒绝猜测的诱惑。

现在,在您的特定情况下,您已经对是否 进行了分支x.imag != 0,因此您知道,x.imag == 0当您进行测试时x,您可以简单地采取实际的部分,IIUC:

>>> x = 3+0j
>>> type(x)
<type 'complex'>
>>> x > 0
Traceback (most recent call last):
  File "<ipython-input-9-36cf1355a74b>", line 1, in <module>
    x > 0
TypeError: no ordering relation is defined for complex numbers

>>> x.real > 0
True
于 2013-04-30T04:10:38.760 回答
2

从您的示例代码中不清楚x是什么,但它似乎必须是一个复数。有时,当使用复数值方法时,即使精确解应该是实数,近似解也会以复数出现。

复数没有自然顺序,所以如果是复数,不等式x > 0就没有意义了。x这就是类型错误的含义。

于 2013-04-30T04:11:51.267 回答