プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。趣味でプログラミングをしているものです。
さっそくですが質問させていただきます。

Java で文具店で1000円くらいで売っているような電卓を再現
しようとしているのですが
平方根のボタンを押したときの処理でつまづいています。

3 を入力して平方根のボタンを押すと以下のサイトに表示されている限りにおいては
同じ数値になります。

http://ja.wikipedia.org/wiki/3%E3%81%AE%E5%B9%B3 …

ここで質問の内容について説明させていただきます。
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;
}
-----------------------------------------------
長文になりもうしわけありませんが、
ごぞんじのかた、教えていただけないでしょうか?
よろしくお願いします。

A 回答 (1件)

>0.5 を入力して平方根のボタンを押し続けると


>最後には 1 が表示されます

数学的に言うと
X<1の時√X=1になる事は在り得ません
限りなく1に近づくことはあってもX<1の時√X<1です

>自分の作った電卓では小数点以外の数字は12個表示されるようになっています

精度にこだわる計算を行うのであれば
0.9999999999999…=1
が計算結果として表示されるのはまずいのではないでしょうか?
    • good
    • 0
この回答へのお礼

さっそく回答していただきありがとうございます。
数学的な見解を示して頂きありがたいのですが、
自分の電卓はこのとおりでもよいのかと思えますが、
回答していただけたついでといっては失礼かもしれませんが、
もう少し教えていただけないでしょうか
(1)
数学の授業で極限の考え方というものがあったと思うのですが
極限ではやはり1に近づくのではないでしょうか?
(2)
Windows 標準の電卓ではどのような処理を経て、
1 が表示されるようになっているのでしょうか?

ご存知であれば、教えていただけないでしょうか?
よろしくお願いします。

お礼日時:2013/01/31 23:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!