こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 Javaで文具店などで1000円くらいで市販されている 電卓を再現しようとしているのですが、 質問させていただきたいのは、 平方根の計算についてです。 -------------------------------------------- まずは以下のメソッドのコードを見ていただきたいのですが・・・ このメソッドを用いて3の平方根を求めてみました。 private static BigDecimal sqrt( BigDecimal value ) { BigDecimal two = new BigDecimal( "2" ); BigDecimal x = value.divide( two ); BigDecimal last_x = BigDecimal.ZERO; BigDecimal gap = x.subtract( last_x ); BigDecimal range = BigDecimal.ONE.movePointLeft( 11 );//(a) //int cnt = 0;//(b) BigDecimal t; while( gap.compareTo(range) > 0 )//(c) //while( cnt < 20 )//(d) { last_x = new BigDecimal( x.toString() ); t = value.divide( x, 64, BigDecimal.ROUND_DOWN ); x = x.add( t ).divide( two ); gap = x.subtract( last_x );//(e) //cnt ++; //(f) } return x; } (a)(c)(e) を用いて実行すると 1.732142857142857142857・・・ と小数部分の142857 が循環する値になりました。 (a)(c)(e) をコメントアウトして (b)(d)(f) を用いて実行すると 1.732050807568877293527446341505872366942805253 810380628055806979425806427001953125 とwikipedia の「3の平方根」の記事の値と 記述されている範囲では同じ値が得られました。 -------------------------------------------- そこで質問なのですが、 (1) (a) (c) (e) を用いた場合には、正しい値を得られないのでしょうか? 条件に設定する値などを変えてもだめなのでしょうか? (2) 自分が作っている電卓では12桁の表示を予定しているのですが その場合、メソッド sqrt ないの cnt は while ループ内で いくつまで、インクリメントすればよいのでしょうか? (3) インターネットで調べたこのアルゴリズムは 「ニュートン法」だそうですが、 y = x^2 - C の グラフ、接線などを書いてみて ある程度理解できたのですが、 http://cpplover.blogspot.jp/2010/11/blog-post_20.html 上記サイトではこのアルゴリズムは バビロニア人の方法(Babylonian method) というものだそうですが、 バビロニア人は二次関数の微分はわかっていた、 ということでしょうか? -------------------------------------------- ご存知のかた、教えていただけないでしょうか? よろしくお願いします。
↧