Почему я получаю сообщение об ошибке, связанной с отсутствием упорядочения для комплексных чисел?

См. этот вопрос для получения дополнительной информации. Моя основная проблема по этому вопросу была решена, и мне было предложено задать еще одну для второй проблемы, которая у меня возникла:

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 и определил функцию кубического корня для обработки комплексных чисел. Почему это?


person Community    schedule 30.04.2013    source источник
comment
Каково значение x?   -  person Adam Rosenfield    schedule 30.04.2013
comment
Смотрите другой вопрос. x — это аргумент, передаваемый функции, вычисляющей кубический корень.   -  person    schedule 30.04.2013


Ответы (2)


Сообщения об ошибках в 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
person DSM    schedule 30.04.2013
comment
У меня уже есть функция кубического корня (показанная в другом вопросе), настроенная на обработку комплексных чисел. Это не должно быть проблемой. - person ; 30.04.2013
comment
user2330618: нет. Я имею в виду, настройте его для обработки комплексных чисел. Прямо перед if x < 0: добавьте print(type(x), repr(x)), чтобы убедиться, что x — комплексное число. Затем выберите случайное комплексное число, скажем, 2+3j, и введите 2+3j > 0 в консоли. Обратите внимание на сообщение об ошибке. - person DSM; 30.04.2013
comment
Тогда я думаю, что это будет ошибкой только для комплексных чисел, мнимая часть которых равна нулю. Но я определенно могу исправить это с помощью: elif x.imag == 0: x = x.real - person ; 30.04.2013
comment
Эм, именно это я и сказал: вы можете просто взять настоящую часть, потому что вы знаете, что x.imag == 0. - person DSM; 30.04.2013

Из вашего примера кода неясно, что такое x, но кажется, что это должно быть комплексное число. Иногда при использовании сложных численных методов приближенное решение будет представлять собой комплексное число, хотя точное решение предполагается реальным.

Комплексные числа не имеют естественного порядка, поэтому неравенство x > 0 не имеет смысла, если x комплексное. Вот что такое ошибка типа.

person Community    schedule 30.04.2013