2014-06-25 5 views
1

나는 내 프로그램에서 다음 코드 줄이 있습니다수학 도메인 오류 수학

theta=(180/math.pi)*0.5*math.asin((9.8*dist)/(vel**2)) 

나는 그것이 나에게 다음과 같은 수학 도메인 오류 제공 import math 후 위의 코드를 사용하는 경우 :

Traceback (most recent call last): 
File "traj.py", line 36, in <module> 
processCase(caseNumber,V,D) 
File "traj.py", line 20, in processCase 
theta=(180/math.pi)*0.5*math.asin((9.8*dist)/(vel**2)) 
ValueError: math domain error 

입력은 :이 에러의 원인을

vel= 119 dist= 1445 

. import cmath를 사용하면 오류가 사라지지만 복잡한 숫자가 출력됩니다. 왜 그런가요?

+0

없음 내가 너무 것을 확인. arcsin의 입력 값은 1.0이며 유효합니다. asin (1.0) = 1.57 – user2105632

+1

부동 소수점 부정확으로 인해 값이 정확히 1.0이 아닙니다. 내가 할 때 나는 그 값을 1.0000000000000002로 본다. – BrenBarn

+0

아하, 알 겠어. 감사. 정밀도가 제한됩니다. – user2105632

답변

3

(9.8*dist)/(vel**2)을 1.0 이상으로 반올림하는 부동 소수점 오류로 인해, asin 함수는 도메인 오류를 발생시킵니다.

반올림 여부와 관계없이 math.asin 호출의 수를 최대 1.0으로 제한하여이 문제를 해결할 수 있습니다. Decimal 산술을 사용하여 적절한 "수학적"방법으로 수행 할 수 있지만 성능 및 복잡성에 큰 영향을 미칩니다.

내 조언은 단순히 asin 호출 min에 전화를 넣어 없습니다 :

theta=(180/math.pi)*0.5*math.asin(min(1.0, ((9.8*dist)/(vel**2))) 
2

여기서 오류 math.asin()은 수학 영역 오류를 제공합니다. math.asin (1.0000000000000002)