java 電卓 平方根
こんにちは。趣味でプログラミングをしているものです。
さっそくですが質問させていただきます。
Java で文具店で1000円くらいで売っているような電卓を再現
しようとしているのですが
平方根のボタンを押したときの処理でつまづいています。
3 を入力して平方根のボタンを押すと以下のサイトに表示されている限りにおいては
同じ数値になります。
http://ja.wikipedia.org/wiki/3%E3%81%AE%E5%B9%B3%E6%96%B9%E6%A0%B9
ここで質問の内容について説明させていただきます。
Windows に標準で付属している電卓では
0.5 を入力して平方根のボタンを押し続けると
最後には 1 が表示されます。
ですが、以下に示す自分のコードだと
0.99999999998 と表示されてその後
平方根のボタンを押し続けても同じ結果になります。
0.99999999998 で収束しているのだと思いますが、
(自分の作った電卓では小数点以外の数字は12個表示されるようになっています。)
1 に収束するようにするには、
以下に示す メソッドsqrt 内の計算部分の
割り算のスケールの指定とかを変えれば
うまくいくのでしょうか?
-----------------------------------------------
平方根のボタンを押したときの処理です。
case CalculatorEvent.TYPE_SQRT :
if( negativeflag )
{
if( ! display.showBigMinus )
showNumString = showNumString.substring( 1 );
}
result = sqrt( new BigDecimal( showNumString ) );
//test statement
System.out.println( "from 1446 : " + result.toString() );
result = result.setScale( 32, RoundingMode.HALF_UP );
showNumString = result.toString();
//test statement;
System.out.println( "sqrt result : " + showNumString );
//
.
.
.
.
//以下おもに端数を表示桁数に丸めて、
//負の値の平方根を求めたときは
//絶対値の平方根を求めて表示
// エラーであるマークも表示
// 呼び出し元に例外を投げる
// 呼び出した側で例外を受け取ると
// 電卓のボタンを入力できないようにする
-----------------------------------------------
上記コード test statement は以下の出力結果になると
以後 平方根のボタンを押しても同じ結果が出力されます。
from 1446 : 0.9999999999899999999999499999999994999999999937499999999125000000078125
sqrt result : 0.99999999998999999999995000000000
------------------------------------------------
上記コード中のメソッド sqrt です。
private 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( 64 );
BigDecimal t;
while( gap.compareTo(range) > 0 )
{
last_x = new BigDecimal( x.toString() );
//t = value.divide( x, 64, BigDecimal.ROUND_DOWN );
//test statement
t = value.divide( x, 64, RoundingMode.HALF_EVEN );
//
x = x.add( t ).divide( two );
gap = x.subtract( last_x ).abs();
}
return x;
}
-----------------------------------------------
長文になりもうしわけありませんが、
ごぞんじのかた、教えていただけないでしょうか?
よろしくお願いします。