2012-04-27 124 views
0

您如何用您选择的某种编程语言解决以下等式?高功率和双精度

(1-1/X)^Y 

简单!

但是,当X & Y都是非常大的和X如何>> Y

例如

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

看起来它应该是一个很简单的问题,但让周围的双精度问题施加功率之前是我无法弄清楚。

+1

我相信它是依赖于语言的 - 在某些语言中,我相信你会使用一些实现定点算术的库,如[BigDeci在java中使用[mal]](http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html)。 – amit 2012-04-27 14:37:25

+2

使用wolframalpha.com扩展为没有任何X^Y项的系列表示,然后根据需要计算系列中的许多项以实现所需的精度。 – mbeckish 2012-04-27 14:42:01

+1

致闭幕者:这个题目是怎么回事? – 2012-04-27 15:04:15

回答

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) 

近似对数,并计算

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

如果XY并不大很多,用第三甚至泰勒级数的第四项对数可能是必要的。

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 

只要由Daniel费所作的计算是正确的,该代码使用计算exp(-(Y/X+ Y/(2*X*X)))爪哇的BigDecimal是:

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()); 

}