0

你如何用你选择的某种编程语言来解决下面的等式?

(1-1/X)^Y

简单的!

但是当 X 和 Y 非常大并且 X>>Y 时怎么样?

例如

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

看起来这应该是一个足够简单的问题,但在应用电源之前解决双精度问题是我无法弄清楚的。

4

2 回答 2

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

如果X不大于Y,则可能需要使用对数的泰勒级数的第三项甚至第四项。

于 2012-04-27T14:39:09.390 回答
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 Fischer 的计算是正确的,那么exp(-(Y/X+ Y/(2*X*X)))Java中使用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());

}
于 2012-04-27T17:56:27.437 回答