解答例 - j1.lesson04.MaclaurinExpansionOpt

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 += / 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);
        }
    }
}