Tôi phải lưu trữ sản phẩm của một số giá trị xác suất thực sự thấp (ví dụ: 1E-80). Sử dụng cú pháp java nguyên thủy sẽ dẫn đến số không vì dòng dưới. Tôi không muốn giá trị chuyển thành 0 vì sau này sẽ có số lớn hơn (ví dụ: 1E100) sẽ mang các giá trị trong phạm vi mà đôi có thể xử lý.Java đôi và làm việc với các giá trị thực sự nhỏ
Vì vậy, tôi đã tạo một lớp khác (MyDouble) bản thân mình hoạt động trên lưu phần cơ sở và các phần số mũ. Khi thực hiện phép tính, ví dụ phép nhân, tôi nhân các phần cơ sở và thêm số mũ.
Chương trình nhanh với kiểu kép nguyên thủy. Tuy nhiên, khi tôi sử dụng lớp của riêng tôi (MyDouble) chương trình là rất chậm. Tôi nghĩ rằng điều này là do các đối tượng mới mà tôi phải tạo ra mỗi lần để tạo ra các hoạt động đơn giản và bộ thu gom rác phải làm rất nhiều công việc khi các đối tượng không còn cần thiết nữa.
Câu hỏi của tôi là, có cách nào tốt hơn bạn nghĩ tôi có thể giải quyết vấn đề này không? Nếu không, có cách nào để tôi có thể tăng tốc chương trình với lớp của riêng mình (MyDouble) không?
[Lưu ý: tham gia các log và sau đó lấy số mũ không giải quyết vấn đề của tôi]
MyDouble lớp:
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;
}
}
Tại sao bạn không sử dụng [BigDecimal] (http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html)? – DaoWen
Hoặc 'BigInteger' –
xem http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library –