如何用您选择的某种编程语言解决下面的等式?
(1-1/X)^Y
容易!
但是当X& Y非常大,X>>> Y
e.g。
(1-1/X)^Y
where
X = 10^40
Y = 10^12
看起来它应该是一个足够简单的问题,但在应用电源之前解决双精度问题是我无法弄清楚的。
答案 0 :(得分: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
大得多,则可能需要使用对数泰勒级数的第三项甚至第四项。
答案 1 :(得分: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的计算是正确的,那么使用 BigDecimal 在 Java 中计算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());
}