您如何用您選擇的某種編程語言解決以下等式?高功率和雙精度
(1-1/X)^Y
簡單!
但是,當X & Y都是非常大的和X如何>> Y
例如
(1-1/X)^Y
where
X = 10^40
Y = 10^12
看起來它應該是一個很簡單的問題,但讓周圍的雙精度問題施加功率之前是我無法弄清楚。
您如何用您選擇的某種編程語言解決以下等式?高功率和雙精度
(1-1/X)^Y
簡單!
但是,當X & Y都是非常大的和X如何>> Y
例如
(1-1/X)^Y
where
X = 10^40
Y = 10^12
看起來它應該是一個很簡單的問題,但讓周圍的雙精度問題施加功率之前是我無法弄清楚。
那麼,(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
並不大很多,用第三甚至泰勒級數的第四項對數可能是必要的。
使用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());
}
我相信它是依賴於語言的 - 在某些語言中,我相信你會使用一些實現定點算術的庫,如[BigDeci在java中使用[mal]](http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html)。 – amit 2012-04-27 14:37:25
使用wolframalpha.com擴展爲沒有任何X^Y項的系列表示,然後根據需要計算系列中的許多項以實現所需的精度。 – mbeckish 2012-04-27 14:42:01
致閉幕者:這個題目是怎麼回事? – 2012-04-27 15:04:15