非常に低いいくつかの確率値 (たとえば、1E-80) の積を保存する必要があります。プリミティブ Java double を使用すると、アンダーフローのためにゼロになります。値がゼロになることは望ましくありません。後で、double が処理できる範囲内の値をもたらす大きな数値 (たとえば、1E100) が存在するためです。
そこで、基数部分と指数部分を保存する別のクラス (MyDouble) を自分で作成しました。掛け算などの計算を行うときは、基数を掛けて指数を足します。
プリミティブ double 型でプログラムは高速です。ただし、独自のクラス (MyDouble) を使用すると、プログラムが非常に遅くなります。これは、単純な操作を作成するたびに新しいオブジェクトを作成する必要があり、オブジェクトが不要になったときにガベージ コレクターが多くの作業を行う必要があるためだと思います。
私の質問は、私がこの問題を解決できると思うより良い方法はありますか? そうでない場合、自分のクラス (MyDouble) でプログラムを高速化する方法はありますか?
[注: ログを取ってから指数を取っても問題は解決しません]
MyDouble クラス:
public class MyDouble {
public MyDouble(double base, int power){
this.base = base;
this.power = power;
}
public static MyDouble multiply(double... values) {
MyDouble returnMyDouble = new MyDouble(0);
double prodBase = 1;
int prodPower = 0;
for( double val : values) {
MyDouble ad = new MyDouble(val);
prodBase *= ad.base;
prodPower += ad.power;
}
String newBaseString = "" + prodBase;
String[] splitted = newBaseString.split("E");
double newBase = 0; int newPower = 0;
if(splitted.length == 2) {
newBase = Double.parseDouble(splitted[0]);
newPower = Integer.parseInt(splitted[1]);
} else {
newBase = Double.parseDouble(splitted[0]);
newPower = 0;
}
returnMyDouble.base = newBase;
returnMyDouble.power = newPower + prodPower;
return returnMyDouble;
}
}