ニュートン法でx^2-2=0を解くアルゴリズムを作成しております。
下記のコードを実行した場合、1回目の誤差の表示はうまくいくのですが、2回目のWhile文の判定で
エラーが起きます。
引数には2を渡しています。
Java
1import java.math.BigDecimal; 2 3public class kinjiti { 4 public static void main(String args[]) { 5 BigDecimal x = new BigDecimal(args[0]); 6 BigDecimal delta = new BigDecimal(1); 7 BigDecimal sisu = new BigDecimal(1.0E-16); 8 BigDecimal j = new BigDecimal(2); 9 int count = 0; 10 while (sisu.compareTo(delta) < 0) { 11 x = x.subtract((x.multiply(x).subtract(j)).divide((j.multiply(x)))); 12 delta = x.multiply(x).subtract(j).abs(); 13 ++count; 14 System.out.println(count + "回目 誤差=" + delta); 15 } 16 System.out.println("x = " + x); 17 System.out.println("x * x = " + x.multiply(x)); 18 } 19} 20
【コンソール表示内容(エラー内容)】
1回目 誤差=0.25
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.base/java.math.BigDecimal.divide(BigDecimal.java:1716)
at Newton1.main(Newton1.java:12)
どうして1回目は計算できているのに2回目でエラーが起きるのかわかりません。
ご教示お願いいたします。
【追記】
上記のとおりプログラムを修正したところ、2の平方根が正しく出力されました。
【コンソール】
1回目 誤差=0.2500
2回目 誤差=0.00703889
3回目 誤差=0.0000061592637476
4回目 誤差=4.74200288533215216656E-12
5回目 誤差=2.8108239331373466350562834003132792751609E-24
6回目 誤差=9.8759139788721286232385069031337583760272284804383992169099233938623991426116900E-49
7回目 誤差=1.219170961476023987580884253005982643084857060464517172599001310224667466278282886591601613436503357212794231959984165464850947330556127739804351086766287896576E-97
x = 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764161583921656050189505811755022976
x * x = 2.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001219170961476023987580884253005982643084857060464517172599001310224667466278282886591601613436503357212794231959984165464850947330556127739804351086766287896576
しかし、ソースの[x][j]に引数3.0を指定すると、誤差の表示がループします。
コンソールに誤差が7回ほど出力され、「x = 1.3720508......」と出力される想定でした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/23 05:05
退会済みユーザー
2018/03/23 06:30 編集
2018/03/23 07:10
退会済みユーザー
2018/03/23 07:41