package j1.lesson04;
/**
* 課題0404 - 解答例.
* @author s.arakawa
* @version $Id: MaclaurinExpansionOpt_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class MaclaurinExpansionOpt {
/**
* 自然対数の底eの近似をマクローリン展開によって求めるプログラム。
* @param args 無視される
*/
public static void main(String[] args) {
// 階乗について調べる
// 0! = 1
// 1! = 0! * 1
// 2! = 1! * 2
// 3! = 2! * 3
// ...
// i! = (i-1)! * i, (i = 1,2,...)
// i が 0 の時だけ一般式で表せない
// そこで、式をさらに変形する
// 1/0! + Σ{i=1,...,n-1}(1 / i!)
// -> 0! だけ繰り返しの外に出す
// 常に前回の階乗の値を保存しておく
// 初期値は 0!
// factorial: 前回の階乗の値を保存
double factorial = 1.0;
// 1/0! + ... の、1/0! (= 1) の部分を初期値に埋め込んでおく
// x: 各項の合計を保存
double x = 1.0;
// Σ{i=1,...,n-1}(1 / i!)
for (int i = 1; i < 1000; i++) {
factorial *= i;
x += 1 / factorial;
}
// 残りはほとんど同じ
System.out.println("x = " + x);
System.out.println("e = " + Math.E);
double relativeError = Math.abs(Math.E - x) / Math.E * 100;
if (relativeError < 1) {
System.out.println("誤差は1%未満:" + relativeError);
}
else {
System.out.println("許容されない誤差:" + relativeError);
}
}
}
|