我必须存储几个非常低的概率值的乘积(例如,1E-80)。由于下溢,使用原始 java 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;
}
}