平方根 ニュートン法について
こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。
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)
というものだそうですが、
バビロニア人は二次関数の微分はわかっていた、
ということでしょうか?
--------------------------------------------
ご存知のかた、教えていただけないでしょうか?
よろしくお願いします。
お礼
回答の方、ありがとうございました。