2013-04-30 2 views
4

일부 배경에 대해서는 this question을 참조하십시오. 심지어 하나 개의 실제 루트와 두 개의 복잡한 뿌리"복소수에 대해 정의 된 순서 관계 없음"오류가 발생하는 이유는 무엇입니까?

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 모듈을 사용하고 복소수를 처리하기 위해 큐브 루트 함수를 정의했지만. 왜 이런거야?

+0

'x'의 값은 무엇입니까? –

+0

다른 질문보기 x는 큐브 루트를 계산하는 함수에 전달되는 인수입니다. –

답변

10

파이썬의 오류 메시지는 다음과 같이 매우 훌륭합니다. 내가 말할 수있는 일부 언어와 달리, 그들은 임의의 문자 모음처럼 느껴지지 않습니다. 파이썬은

TypeError: no ordering relation is defined for complex numbers 

당신이 그 단어에 그것을해야

if x > 0: 

것을 비교 불평 그래서 : 당신이 0보다 큰인지 여부를 확인하기 위해 복소수 x를 비교하기 위해 노력하고, 파이썬은 복소수를 정렬하는 법을 모른다. 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 
+0

이미 복소수를 처리하도록 설정된 큐브 루트 함수 (다른 질문에 표시됨)가 있습니다. 이것은 문제가되어서는 안됩니다. –

+0

user2330618 : 아니요. 복소수를 처리하도록 설정 했습니까? 'x <0 :'바로 앞에'print (type (x), repr (x))'를 추가하면'x'는 복소수입니다. 그런 다음 임의의 복소수를 선택하고 '2 + 3j'라고 말한 다음 콘솔에'2 + 3j> 0 '을 입력하십시오. 오류 메시지를 기록하십시오. – DSM

+0

그렇다면, 허수 부가 0 인 복소수에 대해서만 실패 할 것이라고 생각합니다. 그러나 나는 확실히 그것을 고칠 수 있습니다 : elif x.imag == 0 : x = x.real –

2

예제 코드에서 무엇이 x인지 분명하지 않지만 복소수 여야합니다. 때로는 복잡한 수치 방법을 사용하는 경우 정확한 해결책이 실제라고 가정해도 근사 해는 복소수로 나타납니다.

복잡한 숫자는 자연 순서가 없으므로, 은 x이 복잡하면 부적합합니다. 이것이 유형 오류에 관한 것입니다.