こんにちは。趣味でプログラミングをしているものです。
さっそくですが質問させていただきます。
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;
}
-----------------------------------------------
長文になりもうしわけありませんが、
ごぞんじのかた、教えていただけないでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>0.5 を入力して平方根のボタンを押し続けると
>最後には 1 が表示されます
数学的に言うと
X<1の時√X=1になる事は在り得ません
限りなく1に近づくことはあってもX<1の時√X<1です
>自分の作った電卓では小数点以外の数字は12個表示されるようになっています
精度にこだわる計算を行うのであれば
0.9999999999999…=1
が計算結果として表示されるのはまずいのではないでしょうか?
さっそく回答していただきありがとうございます。
数学的な見解を示して頂きありがたいのですが、
自分の電卓はこのとおりでもよいのかと思えますが、
回答していただけたついでといっては失礼かもしれませんが、
もう少し教えていただけないでしょうか
(1)
数学の授業で極限の考え方というものがあったと思うのですが
極限ではやはり1に近づくのではないでしょうか?
(2)
Windows 標準の電卓ではどのような処理を経て、
1 が表示されるようになっているのでしょうか?
ご存知であれば、教えていただけないでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby プログラミングについてです。教えていただきたいです。 実行例のように、整数xが1から12までにつき、 2 2022/12/19 22:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ 1 2023/02/08 00:18
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
[delphi] 変数を利用してコンポ...
-
モーダレスダイアログについて
-
java 電卓 平方根
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
JButton配列でのイベント処理
-
C++Builder でPanel上にフォー...
-
TableModelListener 通知出し方
-
VBSでCDトレイのオープン/ク...
-
requestFocusについて
-
ゲーム画面(JFrame)のサイズ変...
-
フレーム上のコンポーネントの...
-
ツールボックスのような折りたたみ
-
ファイル保存先のダイアログが...
-
「タイプ初期化子が例外をスロ...
-
次の日本語の意味を教えて下さい
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ファイル保存先のダイアログが...
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
requestFocusについて
-
C#で設定時刻到来時にイベント...
-
ツールボックスのような折りたたみ
-
JScrollPane上のJTableの再描画
-
tableView reloadDataが出来ない
-
アクティブなTextFiel...
-
VBでCPUの使用率を取得できます...
-
VB6のツールボックスへのコンポ...
-
[delphi] 変数を利用してコンポ...
-
コンポーネント
-
Buttonの色
-
JButton配列でのイベント処理
-
TableModelListener 通知出し方
-
VBSでCDトレイのオープン/ク...
-
JOptionPaneのダイアログパネル...
-
VisualBasicのコンポーネントで...
おすすめ情報