推しミネラルウォーターはありますか?

javaのDouble型の足し算をするには、BigDecimalを使わなければ
正確な数値が得られない、ということで使用したのですが、
毎回、小数点の足し算をする度に、
負荷のかかるnew宣言でBigDecimalのインスタンスを作りaddメソッドで計算するというはどうも非効率に思ってしまうのです、、;
javaでの小数点の足し算は皆さん通常どうやっているのでしょうか?

A 回答 (6件)

大概の演算はdouble型の演算精度で足りますし、演算誤差を減らすような演算方法も色々知られています。


double型では有効桁数がどうやっても足りないとか、10進←→2進の変換に伴う誤差を嫌う場合にはBigDecimalを使うしかないかもしれません。

この回答への補足

「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。
二進数double型の計算結果をどの様な基準で丸めればよいか?に悩んでいたので、
それならば、とString→BigDecimal→Stringで扱おうと思ったしだいです。

補足日時:2011/12/11 21:02
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/12 21:46

> クライアントがもたらすランダムな引数を四則計算する場合は、


> 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?

例えば 1.0 / 3.0 を誤差なしで保持する数値型は Java に用意されていません。

結局誤差を制御するには誤差を見積もって計算に必要な精度を見積もるしかなく
簡単なルールといったものはありません。
    • good
    • 0
この回答へのお礼

BigDecimalでも、1.0/3.0は誤差が出るのですね?
知らなかったです。
やはり、自分で結果を制御する式を作るしかないのですね。。
ありがとうございました。

お礼日時:2012/01/03 14:18

> クライアントがもたらすランダムな引数を四則計算する場合は、


> 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?

「○○方程式を××法を使って解く場合に、計算方法や手順をこうすれば誤差を減らせる」のように特定の問題領域についてのノウハウは様々ありますが、完全に任意の値、任意の演算だと無理でしょうね。
    • good
    • 0
この回答へのお礼

ランダムな引数な場合、
望んだ結果を出すように自分で導くしかないんですね。
誤差が出ないような式を造り、どのタイミングで使うか、検討してみます。
ありがとうございました。

お礼日時:2012/01/03 14:13

> 「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。



ごくごく単純な例を挙げます。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は毎回新しい値で累積させないようにしているのですね。
今回は、計算する値、計算方法、回数、結果、が定まっていたケースですが、
たとえば、クライアントがもたらすランダムな引数を四則計算する場合は、
四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか?
その公式の様な物が紹介されているサイトがあれば良いのですが、、。

補足日時:2011/12/11 23:07
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/13 23:10

>javaのDouble型の足し算をするには、BigDecimalを使わなければ


>正確な数値が得られない

これはどこの情報なんでしょうか?
BigDecimalは強力ですけど、「必要な精度」が double で十分ならば、
doubleで処理した方がはるかに効率的です。

doubleの精度は 10進だと 16桁強です。

この回答への補足

小数点の計算をして下記と同じ様な症状が出たのでBigDecimalを使いました。
http://javafaq.jp/S029.html
このサイトの
[S029-Q01]
です。

補足日時:2011/12/11 20:50
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/12 21:46

科学技術系の計算なら大抵はdouble型の精度で十分です。


(それに10進数については丸め誤差がでないと言うことにさほど意味がない。)

(お金の事務計算などで)2進-10進の変換での誤差を気にするなら
最初から最後までBigDecimalを使うべきで
double型を経由するべきではないと思います。

この回答への補足

そうですね。誤差は気になります。
ただ、自分で丸めるのも、
BigDecimalで丸めるのも同じとなるとBigDecimalを使う意味がなくなりますが、、。

補足日時:2011/12/11 21:07
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/12 21:45

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


おすすめ情報