Мне нужно сохранить продукт с несколькими значениями вероятности, которые действительно низки (например, 1E-80). Использование примитивного java double приведет к нулю из-за недостаточного потока. Я не хочу, чтобы значение было равным нулю, потому что позже будет большее число (например, 1E100), которое приведет к значениям в пределах диапазона, который может обрабатывать double.
Итак, я создал другой класс (MyDouble), который работает над сохранением базовой части и частей экспоненты. При выполнении вычислений, например умножения, я умножаю базовые части и добавляю экспоненты.
Программа выполняется с примитивным двойным типом. Однако, когда я использую свой собственный класс (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;
}
}