2009-11-27 4 views
4

그래서 파이썬에서 정밀도 문제가 발생했습니다.표준 라이브러리 - 고정밀 부동 소수점?

나는 다음과 같은 기능을 계산하는 데 싶습니다

P(x,y) = exp(-x)/(exp(-x) + exp(-y)) 

x와 y는> 1000있을 경우. 파이썬의 math.exp (-1000) (2.6 이상)는 이것을 처리하기에 충분한 부동 소수점 정밀도를 가지고 있지 않습니다.

  1. 이 양식은 logistic/logit/log-odds처럼 보이지만 그렇지 않습니다. 여기에 실종 된 대수적 단순화가 있습니까?
  2. 나는 Decimal에 대해 알고 있지만 여기에 적용 할 지 모르겠다.
  3. 은 숙제처럼 보이지만, 그렇지 않다고 나는 약속한다!

(또한, 나는 제목에 열려있어! 나는이 질문에 대한 좋은 생각하지 못했습니다!)

+0

"10 진수를 알고 있지만 여기에 적용 할 수 있는지 확실하지 않습니다"? 당신이 그것을 시도한 후에, 당신은 무엇을 확신하지 못합니까? –

+2

글쎄, 내가 아래에서 지적했듯이, 나는 Decimal()이 exp 메소드를 가지고 있다는 것을 깨닫지 못했다. math.exp (Decimal())가 작동하지 않습니다. RTFM 치료를 받고 싶다면 적어도 TFM에 연결하십시오. –

+2

물론 math.exp()는 작동하지 않습니다. 그것은 부유물을 기대합니다. 수학 모듈은 C 수학 함수를 반영합니다. 나는 당신에게 RTFM 치료법을주고 싶지 않다. CHM 문서의 색인 패널에 "유형 특급"을주고 싶다. cmath와 수학 함수가 뒤 따르는 두 개의 10 진법을 나열한다. http : //docs.python.org/search.html? q = exp' (10 진법은 7 번째와 8 번째 히트입니다.) ""치료법과 " 'X에 대해 알고 있지만 적용 할 지 모르겠다. 여기 치료. –

답변

8

당신이 exp(-x)

P(x,y) = 1/(1 + exp(x-y)) 
+1

또는 가난한 오래된 뇌 세포에 마모가 적고 위와 아래에'exp (x)'를 곱하면됩니다 : –

+0

사실, exp (xy)가 여전히 (xy)> 1000의 값. – steveha

+1

+1 근육보다 뇌를 사용하는 것이 좋습니다. @steveha : x와 y는 순서가 비슷할 가능성이 높습니다. 그러면 상황이 크게 개선 될 것입니다. – u0b34a0f6ae

3

난 당신이 임의 정밀도 부동 소수점 신뢰성에 대한 bigfloat 패키지를 찾고 생각 산수.

P(x,y) = 1/(1 + exp(x-y)) 

는 아마도 두 번째는 더 정밀도를 사용하지 않고 작동합니다에

+0

표준 라이브러리의 일부는 아니지만 알아두면 좋을 것입니다. 링크 주셔서 감사합니다! –

+0

그리고 때로는 Windows에서 특히 고통 스럽습니다. –

4
P(x,y) = exp(-x)/(exp(-x) + exp(-y)) 

하여 상단과 하단을 나눌 수있는 것은 동일합니다.

+0

나는 너의 것도 받아 들일 것이다. 나는 왜 내가 그것을 볼 수 없었던 지 모른다. 감사! –

8
>>> import decimal 
>>> decimal.Decimal(-1000).exp() 
Decimal('5.075958897549456765291809480E-435') 
>>> decimal.getcontext().prec = 60 
>>> decimal.Decimal(-1000).exp() 
Decimal('5.07595889754945676529180947957433691930559928289283736183239E-435') 
+2

Decimal을 실제로 사용하는 방법을 설명해 주셔서 감사합니다. 'exp'방법이 있다는 것을 몰랐습니다. –