2012-01-02 2 views
3

내가 가지고 math domain error 예외 발생이 코드 :이 파이썬 수치 오류를 가장 잘 처리하는 방법은 무엇입니까?

v = -1.0 

for i in range (201): 
    print acos (v) 
    v += 0.01 

을하지만이로 변경하는 경우, 작동 :

v = -100 

for i in range (201): 
    print acos (v/100.0) 
    v += 1 

이 때문에 반올림인가?

어떻게 이것을 파이썬에서 가장 잘 해결할 수 있을까요? 아니면 그냥 마지막 예처럼해야합니까?

+0

나에게는 수학적인 문제처럼 보입니다. 'acos'가 입력을 지원하는지 확인 했습니까? – muhuk

+1

볼 수 있는지 모르겠지만 두 번째 코드가 첫 번째 코드와 다른 것을 수행 중입니다 ... – JBernardo

+0

죄송합니다 첫 번째 예제에서 마지막 줄을 고쳤습니다. –

답변

9

당신이 할 경우

>>> format(0.01, '.30f') 
'0.010000000000000000208166817117' 

당신이 (배 정밀도 부동 소수점 숫자 등) 0.01 당신이 학교에서 배운 수 0.01보다 큰 것을 알 수있다.

>>> sum([0.01]*100) 
1.0000000000000007 

을 그리고 그 수학 도메인 오류를 줄 충분 :

그래서, 당신이 100 회를 요약 할 때, 오류가 더 큰 가져옵니다.

무엇을 할 수 있습니까?

:

  • 는 두 번째 코드 덜 소수점에
  • round() 사용합니다.

    >>> round(1.0000000000000007, 13) 
    1.0 
    

    13 또는 14로 충분할 수 있습니다.

1

이 작업을 시도 할 수 있습니다 :

v = -1.0 
for i in range(201): 
    print acos(v) 
    v = round(v + 0.01, 2) 

그것은 귀하의 질문에 대한 작동합니다. 부동 소수점 숫자의 경우와 동일한 오래된 문제입니다. 모든 십진수가 이진수로 정확하게 표현 될 수있는 것은 아닙니다. 이 실행

v = -1.0 
for i in range(201): 
    print repr(v), acos(v) 
    v += 0.01 

을 그리고 당신은 바로 오류 전에, 루프의 끝에서 저를 볼 수 있습니다, v는이 math domain error 원인이 무엇이라고 약간 1.0보다 큰, 그리고 값이 있습니다.

+0

v를 증가시킨 후 직접 라운드하는 것이 더 좋으므로 오류가 시간 경과에 따라 커지지는 않습니다. –

+0

@NiklasBaumstark 제안에 감사드립니다, 그에 따라 내 대답을 편집했습니다. –

관련 문제