2011-09-20 24 views
3

에 대한 BigDecimal의와 자바 스크립트에 Math.exp()를 사용하여 : x 긴 부동 소수점 숫자입니다내가 자바 스크립트에 다음과 같은 계산을 수행하려고 시도하고있어 큰 부동 소수점 숫자

e^x/(1 + e^x) 

.

이 경우 최소한 소수점 10 자리까지 정확해야합니다.

나는 The Floating Point Guide에 제안 된대로 부동 소수점 숫자를 정확하게 처리하기 위해 BigDecimal을 사용 해왔다. 의

내 첫 번째 시도는 :

TypeError: Object xxxxx has no method 'add' 

그래서 내가 BigDecimal를 객체로 시도 변환 bar에 시도 :
var foo = new BigDecimal(myVeryLongFloatingPoint) 
var bar = Math.exp(foo); 
var spam = bar.divide(bar.add(new BigDecimal("1"))); 

은 (xxxxx는 부동 소수점 숫자가) 오류로했다

var foo = new BigDecimal(myVeryLongFloatingPoint) 
var bar = new BigDecimal(Math.exp(foo)); 
var spam = bar.divide(bar.add(new BigDecimal("1"))); 

이 차례로 오류가 발생합니다 (여기서 xxxxx는 부동 p입니다. oint 번호) :

BigDecimal(): Not a number: xxxxx 

어디로 가고 있습니까?

고도의 정밀도가 요구되는 부동 소수점을 사용하여 이러한 종류의 계산을 처리하는 것이 현명한 접근입니까?

+1

을 정규 (이진수) 수레를 사용하면 무엇이 잘못됩니까? 그것이 오버플로가된다면, 표현식을 '1/(1 + e^-x)'형식으로 다시 쓰지 않고 양수'x'에 사용하십시오. –

+0

고마워, 나는 이것과 연극을 할거야. – Kenners

답변

2

당신은 BigDecimal에 문자열을 통과해야합니다

var bar = new BigDecimal(Math.exp(foo).toString()); 
+0

고마워요.이게 저를 위해 고쳐졌습니다. – Kenners

1

Math.exp은 일반 숫자에서 작동하며 이 BigDecimal를에없는를 조작 할 수 있습니다. 계속하기 전에 Math.exp가 아마 foo를 NaN (또는 이와 비슷한 것)으로 변환하고있을 것입니다.

BigDecimal 클래스에서 지수 방법을 찾아야합니다. 나는 소스를 보았고 여러분이 대신 사용할 수있는 BigDecimal.pow 메서드가 있다고 생각한다.

2

유용 할 수도있는 몇 가지 수학적 접근법이 있습니다. x이 양수이고 합리적으로 크다면 두 개의 큰 숫자의 비율을 취하는 것이므로 최종 정밀도가 떨어집니다. 대신

  1. 1./(1. + e^(-x))을 대신 사용할 수 있습니다.
  2. 큰 x의 경우 약 1.-e^(-x)이며 x가 클수록 근사값이 좋습니다 (예 : x = 100이면 오류는 86 번째 숫자가됩니다).

(솔직히, 사람이 그것을 사용하기 전에이를 확인해야한다, 나는 단지 여기 아래에 떨어져 메모리의 쓰고 있지 아무것도거야하지만,이 유용 보이는 경우, 나는 ... 연필을 잡을 수)