アプリ版:「スタンプのみでお礼する」機能のリリースについて

 Javaでのある数の小数点乗について
 数学での計算をJavaを使って計算している所です。Javaの中でもDoubleを使うのではなく、BIgDecimalクラスを使って計算をしています。しかし、BigDecimalの値をBigDecimal乗するという事は出来ないですよね? Math.powを使えばDouble型のDouble乗は出来ますが…
 そこで、任意の精度で小数点の小数点乗を求める方法は無いでしょうか?

必要ないかもしれませんが参考までに
言語:Java
OS:MacOS 10.5

A 回答 (3件)

標準ではできないのでBigDecimal用のpowを自作するしかないですね。


Math.powを浮動小数点演算機能のないCPUで実装するのと同様に適当な近似式で計算するしかないですが、任意精度に対応するためには精度と丸めに注意して作成する必要があります。
この実装は簡単ではないでしょう。

BigDecimalはBigIntegerのunscaledValueに対して小数点以下の有効桁数を示すscaleで小数点位置を示すことで小数を表現できるようにしています。
powをlogとexpで表現しても、scale部分のlogを常用対数で表現するだけならともかくunscaledValueの部分はBigIntegerの対数を計算しなければいけません。またexpも整数乗ならともかく小数乗だと四則演算ではすみません。logやexpを実装するのも結構面倒な話です。
なお、指数を分数表現しても1/2乗は平方根、1/3乗は立方根と、これまた簡単な計算ではないです。
任意精度を出すとなると、その精度まで計算するのに必要な級数あるいは近似有理関数式を算出してそれで計算するというプログラムになるでしょう。浮動小数点数の計算と比べても格段に難しいプログラムになることと想像できます。
    • good
    • 0

分数にすればいいんじゃないですか?


0.03を3/100とかにして乗数、被乗数ともに分数にして分解してあげればそれぞれはint型のPowと掛算(もしくは割り算)に置き換えられませんか?
    • good
    • 0

考え方はいくつかあると思うけど, たとえば


a^b = exp (b*log(a))
とする手はあると思う. log は scale や unscaledValue なんかから計算することができるし, b*log(a) が求まれば exp (b*log(a)) は単純.
    • good
    • 0

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