2014-12-09 6 views
2

큰 숫자로 작업하고 부동 값 손실 문제가 발생했습니다.큰 숫자가있는 파이썬 부동 소수점

큰 숫자를 곱하면 부동 소수점 부분이 누락되거나 손실되어 0이됩니다. 숫자가 작은 동일한 코드를 사용하는 경우에는 발생하지 않습니다.

사소한 예 :

두 번째 호출에서 보는 바와 같이
import math 
f_ProNum(31 * 61) ## Correct: DEBUG float: 314.833333 
f_ProNum(5915587277 * 3367900313) ## Incorrect: DEBUG float: 3320518040297852928.000000 

def f_ProNum(v_Num): 
    """Syntax: (int); Returns: (float)""" 
    print("DEBUG float: %f") %((v_Num - 2.0)/6.0) # DEBUG 
    v_PDNum = (v_Num - 2.0)/6.0 
    return v_PDNum 

, 플로트 손실, 또는 제로로 설정 얻을 것으로 보인다.

왜 이렇게하고 있으며 어떻게 해결할 수 있습니까?

+0

: https://en.wikipedia.org/wiki/Floating_point#Internal_representation

, 당신은 당신이 필요로하는 정밀도를 구성 할 수 있습니다 decimal 모듈을 사용하여 시도 할 수 있습니다 문제를 해결하기 위해? –

+0

숫자가 작은 첫 번째 호출에서 반환 된 소수점 이하 소수점 숫자 인 소수점 이하 자릿수. 두 번째 호출에서 손실 된 부동 소수점은 ".83333333"입니다. –

+0

십진 모듈을 사용해 보셨습니까? 관련 http://stackoverflow.com/questions/2663612/nicely-representing-a-floating-point-number-in-python –

답변

4

큰 부동 소수점 값은 정밀도를 잃습니다. 비트를 단순화하기 위해 부동 소수점에는 가수 또는 significand라고하는 고정 된 수의 "숫자"가 있으므로 충분히 큰 수는 본질적으로 소수 자릿수의 왼쪽에있는 모든 자릿수를 사용하게됩니다. 더 참조하십시오 : 당신이 출력으로 기대 것을 https://docs.python.org/2/library/decimal.html

+0

트릭을 했나요? 정말 고마워. 어제 밤까지 이것을 연구했지만 기쁨은 없었습니다. –

관련 문제