我有一段关于calc的代码:
public static double CalcPoisson(double m, double u, boolean va)
{
double answer = 0;
if(!va)
{
answer = (Math.exp(-u)* Math.pow(u, m)) / (factorial(m));
}
if(va)
{
for(int i = 0; i < m; i++)
{
answer = answer + (Math.exp(-u)* Math.pow(u, i)) / (factorial(i));
}
}
return answer;这就是我的阶乘方法
public static double factorial (double n)
{
return n == 0 ? 1 : n *factorial(n-1);
}问题是:要计算的最大值是170.我需要更多的方法(如500的阶乘)
我写了一个新的方法:
public static BigDecimal factorial2 (double n)
{
BigDecimal fct = BigDecimal.valueOf(1);
for(int i = 1; i<=n; i++)
{
fct = fct.multiply(BigDecimal.valueOf(i));
}
return fct;如何在"CalcPoisson“方法中使用新的阶乘方法?问题是,我不能用BigDecimal除以.
谢谢你的帮助:)
对任何人来说:
我仍然有这行代码在一个使用CalcPoisson的方法,我仍然与BigDecimal不好,我不能处理它。
这条线:
BigDecimal nenner = CalcPoisson(m, u, false) + (1-p) * CalcPoisson(m, u, true);发布于 2016-08-17 17:24:20
您可以将双份转换为BigDecimal,然后可以按以下方式划分两个BigDecimal:
BigDecimal answer = BigDecimal.ZERO;
BigDecimal myOwn = new BigDecimal(Double.toString(Math.exp(-u)* Math.pow(u, i)));
answer = answer.add(myOwn.divide(factorial2(i)));使用BigDecimal查找阶乘,就像在factorial2()中所做的那样。
最后,您的方法将类似于:
public static BigDecimal CalcPoisson(double m, double u, boolean va)
{
BigDecimal answer = BigDecimal.ZERO;
if(!va)
{
BigDecimal myOwn1 = new BigDecimal(Double.toString((Math.exp(-u)* Math.pow(u, m))));
answer = myOwn1.divide(fakultaet(m));
}
if(va)
{
for(int i = 0; i < m; i++)
{
BigDecimal myOwn = new BigDecimal(Double.toString(Math.exp(-u)* Math.pow(u, i)));
answer = answer.add(myOwn.divide(factorial2(i)));
}
}
return answer;假设您有返回类型的方法,fakultaet()是BigDecimal。如果具有相同的返回值double,则请尝试:
answer = myOwn1.divide(new BigDecimal(fakultaet(m)));编辑
BigDecimal nenner = CalcPoisson(m, u, false).add((BigDecimal.ONE.subtract(new BigDecimal(p))).multiply( CalcPoisson(m, u, true)));发布于 2016-08-17 17:51:41
for(int i = 0; i < m; i++)
{
answer = answer + (Math.exp(-u)* Math.pow(u, i)) / (factorial(i));
}请注意,此算法计算从0到m-1的所有阶乘。考虑到这一点,速度要快得多,而且更准确:
long fact = 1;
for(int i = 0; i < m; i++) {
answer = answer + (Math.exp(-u)* Math.pow(u, i)) / fact;
fact *= (i+1);
}然后注意,Math.exp(-u)在循环中是不变的,因此提取它:
long fact = 1;
double eu = Math.exp(-u);
for(int i = 0; i < m; i++) {
answer = answer + (eu * Math.pow(u, i)) / fact;
fact *= (i+1);
}还可以消除对Math.pow()的重复调用:
long fact = 1;
double eu = Math.exp(-u);
double term = u;
for(int i = 0; i < m; i++) {
answer = answer + (eu * term) / fact;
fact *= (i+1);
term *= u;
}最后,您还可以将术语和事实合并成一个参数(留作学生的练习)。
发布于 2016-08-17 17:27:06
您可以在双BigDecimal中创建一个新的
然后,您可以使用BigDecimal的乘法方法。
fct = fct.multiplie(new BigDecimal(doubleValue));https://stackoverflow.com/questions/39002673
复制相似问题