2016-08-15 5 views
1

したがって数値的方法でe(第3行目)を計算していました。数値計算によるe計算中の浮動小数点の不正確度

enter image description here

私は、私はすべての繰り返しを使用する要素の数を増やしました。そして、私がプログラムを実行すると、浮動小数点変数は私が理解していない方法で動作しました。ここにプログラムとその結果があります。

import java.util.Scanner; 

    public class Test { 

     public static void main(String[] args) { 

      Scanner input = new Scanner(System.in); 

      int factorial = 1; 
      int counter = 0; 
      int iterationNumber; 
      double total = 0; 
      int tempCounter; 

      System.out.print("Enter iteration number: "); 
      iterationNumber = input.nextInt(); 

      while (counter <= iterationNumber) { 

      tempCounter = counter; 

      while ((tempCounter - 1) > 0) { 
       factorial *= tempCounter; 
       tempCounter--; 
      } 

      total += ((double)1/factorial); 
      System.out.println(total); 

      factorial = 1; 
      counter ++; 
      } 
     } 
    } 

enter image description here

eの値がしばらくの代わりに増加減少し始めるんだから、なぜ私の質問はありますか?私は浮動小数点変数がこのプログラムとその背後にあるロジックの間にどのように動作するのかを知りたい。

もう1つの質問は、なぜそれが無限と言うのですか?

+0

1 /(n!)が小さくなり過ぎると、フローポイントがオーバーフローして値が負になり、その結果が小さくなります。 – Blobonat

+0

これらの計算には 'BigDecimal'を使ってみてください。精度と丸めモードを定義する必要がありますが、依然としてはるかに高い精度と高い数値範囲を得ることができます。 – Thomas

答えて

3

n!はすぐにInteger.MAX_VALUEを超え、負の数にオーバーフローします。次に、合計に負の数を追加します。つまり、減少します。

あなたの計算にはBigDecimalを使用できます。それは遅いですが、仕事をします。

関連する問題