No.1ベストアンサー
- 回答日時:
大概の演算はdouble型の演算精度で足りますし、演算誤差を減らすような演算方法も色々知られています。
double型では有効桁数がどうやっても足りないとか、10進←→2進の変換に伴う誤差を嫌う場合にはBigDecimalを使うしかないかもしれません。
この回答への補足
「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。
二進数double型の計算結果をどの様な基準で丸めればよいか?に悩んでいたので、
それならば、とString→BigDecimal→Stringで扱おうと思ったしだいです。
No.6
- 回答日時:
> クライアントがもたらすランダムな引数を四則計算する場合は、
> 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?
例えば 1.0 / 3.0 を誤差なしで保持する数値型は Java に用意されていません。
結局誤差を制御するには誤差を見積もって計算に必要な精度を見積もるしかなく
簡単なルールといったものはありません。
BigDecimalでも、1.0/3.0は誤差が出るのですね?
知らなかったです。
やはり、自分で結果を制御する式を作るしかないのですね。。
ありがとうございました。
No.5
- 回答日時:
> クライアントがもたらすランダムな引数を四則計算する場合は、
> 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?
「○○方程式を××法を使って解く場合に、計算方法や手順をこうすれば誤差を減らせる」のように特定の問題領域についてのノウハウは様々ありますが、完全に任意の値、任意の演算だと無理でしょうね。
ランダムな引数な場合、
望んだ結果を出すように自分で導くしかないんですね。
誤差が出ないような式を造り、どのタイミングで使うか、検討してみます。
ありがとうございました。
No.4
- 回答日時:
> 「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。
ごくごく単純な例を挙げます。3.1から4.0まで0.1刻みの値を得ようとするものですが、3.3のところからxとyで差が出ていることが分かりますよね。
double x=3.0;
double y0=3.0, y;
for (int i=1; i<=10; i++) {
x += 0.1;
y = y0+0.1*i;
System.out.println("x="+x+", y="+y);
}
x=3.1, y=3.1
x=3.2, y=3.2
x=3.3000000000000003, y=3.3
x=3.4000000000000004, y=3.4
x=3.5000000000000004, y=3.5
x=3.6000000000000005, y=3.6
x=3.7000000000000006, y=3.7
x=3.8000000000000007, y=3.8
x=3.900000000000001, y=3.9
x=4.000000000000001, y=4.0
この回答への補足
なるほど!xが三回目から累積誤差を出しているのを見て、
yは毎回新しい値で累積させないようにしているのですね。
今回は、計算する値、計算方法、回数、結果、が定まっていたケースですが、
たとえば、クライアントがもたらすランダムな引数を四則計算する場合は、
四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?
その公式の様な物が紹介されているサイトがあれば良いのですが、、。
No.3
- 回答日時:
>javaのDouble型の足し算をするには、BigDecimalを使わなければ
>正確な数値が得られない
これはどこの情報なんでしょうか?
BigDecimalは強力ですけど、「必要な精度」が double で十分ならば、
doubleで処理した方がはるかに効率的です。
doubleの精度は 10進だと 16桁強です。
この回答への補足
小数点の計算をして下記と同じ様な症状が出たのでBigDecimalを使いました。
http://javafaq.jp/S029.html
このサイトの
[S029-Q01]
です。
No.2
- 回答日時:
科学技術系の計算なら大抵はdouble型の精度で十分です。
(それに10進数については丸め誤差がでないと言うことにさほど意味がない。)
(お金の事務計算などで)2進-10進の変換での誤差を気にするなら
最初から最後までBigDecimalを使うべきで
double型を経由するべきではないと思います。
この回答への補足
そうですね。誤差は気になります。
ただ、自分で丸めるのも、
BigDecimalで丸めるのも同じとなるとBigDecimalを使う意味がなくなりますが、、。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング
-
べき乗
-
doubleとintの違い
-
四捨五入
-
実数 2.0 に対して int(2.0) ==...
-
Javaによる利率計算の実装方法
-
java プログラム 範囲を指定し...
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
double型の足し算について
-
[JAVA]try 内の変数を外で!?
-
VBAで配列の計算
-
【Java8以降】csvファイルの複...
-
プログラミングの問題です。大...
-
Java配列でNullPointerExceptio...
-
オブジェクトの中のプロパティ...
-
JPanelの切り替えと再描画
-
Java 読み込んだテキストファイ...
-
eclipseでコンソールのピン留め...
-
JAVA 文字色変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実数からの小数部の取得
-
0dの意味を教えてください
-
べき乗
-
Javaで何パーセント%かを表示...
-
JAVAのプログラムで、2乗計算...
-
分を表す数値(int型)を、小数...
-
double型変数値の整数部分のみ...
-
javaの課題。。
-
javaで1.8x10の308乗÷...
-
少数50桁以上を表示するには
-
double型の足し算について
-
doubleについて
-
Javaコンパイルエラー
-
手入力された値を0.5区切りに変...
-
数値積分について
-
最大値と最小値の求め方
-
最大値を求めるプログラム
-
Javaのeval関数処理
-
javaでC++のdefine文に相当する...
-
Java math.powメソッド
おすすめ情報