gpt4 book ai didi

Java double 并使用非常小的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:50 26 4
gpt4 key购买 nike

我必须存储几个非常低的概率值的乘积(例如,1E-80)。由于下溢,使用原始 java double 将导致零。我不希望该值变为零,因为稍后会有一个更大的数字(例如 1E100)将值置于 double 可以处理的范围内。

因此,我自己创建了一个不同的类 (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;
}
}

最佳答案

解决这个问题的方法是在日志空间中工作---它使问题变得微不足道。当你说它不起作用时,你能给出具体原因的细节吗?概率下溢是概率模型中的一个常见问题,我想我从来不知道它可以通过任何其他方式解决。

回想一下 log(a*b) 就是 log(a) + log(b)。类似地,log(a/b) 是 log(a) - log(b)。我假设因为你正在处理概率,它的乘法和除法导致了下溢问题;对数空间的缺点是您需要使用特殊例程来计算 log(a+b),如果这是您的问题,我可以指导您。

所以简单的答案是,在对数空间中工作,并在最后重新求幂以获得人类可读的数字。

关于Java double 并使用非常小的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12811839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com