2012-04-27 6 views
0

원하는 프로그래밍 언어로 아래 수식을 어떻게 풀 수 있습니까?고출력 및 배정도

(1-1/X)^Y 

쉽지!

하지만 어떻게 X & Y가 매우 크고 X 때 약 >> Y

예를 들어, 이 간단한 충분히 문제가 될 수 있지만, 전원을인가하기 전에 배정 밀도 문제를 해결 점점 내가 알아낼 수 없습니다 뭔가해야처럼

(1-1/X)^Y 
where 
X = 10^40 
Y = 10^12 

보인다.

+1

나는 그것이 언어에 의존한다고 믿는다 - 어떤 언어에서는, 당신이 고정 소수점 arithmeric을 구현하는 라이브러리를 사용할 것이라고 생각한다. ['BigDeci mal'] (http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html)을 참조하십시오. – amit

+2

wolframalpha.com을 사용하여 X^Y 용어가없는 시리즈 표현으로 확장 한 다음 원하는 정확도를 얻기 위해 필요한만큼 일련의 조건을 계산하십시오. – mbeckish

+1

closevoter에게 :이 주제는 어떻게 꺼져 있습니까? –

답변

4

음, (1 - 1/X)^Y = exp(Y*log(1 - 1/X)). 심지어 제를 사용하거나, X이 매우 큰, 그리고 Y보다 훨씬 큰 경우, 당신은

log(1 - 1/x) = -1/x -1/(2*X^2) + O(1/X^3) 

으로 로그를 대략 수 XY보다 훨씬 큰 경우

exp(-(Y/X+ Y/(2*X*X))) 

을 계산 로그의 Taylor 계열의 네 번째 항이 필요할 수 있습니다.

0

사용 GNU Octave 계산은 대략 :

octave:1> x = 10^40 
x = 1.0000e+40 
octave:2> y = 10^12 
y = 1.0000e+12 
octave:3> (1-1/x)^y 
ans = 1 

octave:8> exp(-(y/x + y /(2*x*x))) 
ans = 1 

다니엘 피셔에 의해 계산이 올바른지 다만, 코드 을 사용 에서의 BigDecimal 자바exp(-(Y/X+ Y/(2*X*X)))를 계산하는 것이다

public static void main(String[] args) { 
    BigDecimal x = new BigDecimal(10,MathContext.UNLIMITED).pow(40); 
    BigDecimal y = new BigDecimal(10,MathContext.UNLIMITED).pow(12); 

    BigDecimal twoXSquared = new BigDecimal(2,MathContext.UNLIMITED).multiply(x).multiply(x); 
    BigDecimal yDividedByTwoXSquared = y.divide(twoXSquared); 

    BigDecimal yDividedByX = y.divide(x); 


    BigDecimal exponent = new BigDecimal(-1,MathContext.UNLIMITED).multiply(yDividedByX.add(yDividedByTwoXSquared)); 
    System.out.println(exponent.toEngineeringString()); 

    BigDecimal result = new BigDecimal(Math.E,MathContext.UNLIMITED).pow(exponent.intValue()); 

    System.out.println(result.toEngineeringString()); 

}