Tengo que almacenar el producto de varios valores probabilty que son realmente bajos (por ejemplo, 1E-80). El uso del doble java primitivo daría como resultado cero debido al flujo inferior. No quiero que el valor vaya a cero porque más adelante habrá un número mayor (por ejemplo, 1E100) que traerá los valores dentro del rango que puede manejar el doble.Java doble y funciona con valores muy pequeños
Así que creé una clase diferente (MyDouble) que funciona para guardar la parte base y las partes del exponente. Al hacer cálculos, por ejemplo, multiplicación, multiplico las partes de base y agrego los exponentes.
El programa es rápido con el tipo doble primitivo. Sin embargo, cuando uso mi propia clase (MyDouble) el programa es realmente lento. Creo que esto se debe a los nuevos objetos que tengo que crear cada vez para crear operaciones simples y el recolector de basura tiene que trabajar mucho cuando los objetos ya no son necesarios.
Mi pregunta es, ¿hay una mejor manera de pensar que puedo resolver este problema? Si no, ¿hay alguna manera de acelerar el programa con mi propia clase (MyDouble)?
[Nota: tomar el registro y luego tomar el exponente no resuelve mi problema]
clase MiDouble:
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;
}
}
¿Por qué no usa [BigDecimal] (http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html)? – DaoWen
o 'BigInteger' –
ver http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library –