首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高因子Poisson Calc

高因子Poisson Calc
EN

Stack Overflow用户
提问于 2016-08-17 17:15:02
回答 4查看 85关注 0票数 1

我有一段关于calc的代码:

代码语言:javascript
复制
    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;

这就是我的阶乘方法

代码语言:javascript
复制
    public static double factorial (double n)
{
    return n == 0 ? 1 : n *factorial(n-1);
}

问题是:要计算的最大值是170.我需要更多的方法(如500的阶乘)

我写了一个新的方法:

代码语言:javascript
复制
    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不好,我不能处理它。

这条线:

代码语言:javascript
复制
        BigDecimal nenner = CalcPoisson(m, u, false) + (1-p) * CalcPoisson(m, u, true);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-17 17:24:20

您可以将双份转换为BigDecimal,然后可以按以下方式划分两个BigDecimal

代码语言:javascript
复制
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()中所做的那样。

最后,您的方法将类似于:

代码语言:javascript
复制
    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,则请尝试:

代码语言:javascript
复制
answer =  myOwn1.divide(new BigDecimal(fakultaet(m)));

编辑

代码语言:javascript
复制
BigDecimal nenner = CalcPoisson(m, u, false).add((BigDecimal.ONE.subtract(new BigDecimal(p))).multiply( CalcPoisson(m, u, true)));
票数 -1
EN

Stack Overflow用户

发布于 2016-08-17 17:51:41

代码语言:javascript
复制
for(int i = 0; i < m; i++)
{
    answer = answer + (Math.exp(-u)* Math.pow(u, i)) / (factorial(i));
}

请注意,此算法计算从0到m-1的所有阶乘。考虑到这一点,速度要快得多,而且更准确:

代码语言:javascript
复制
   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)在循环中是不变的,因此提取它:

代码语言:javascript
复制
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()的重复调用:

代码语言:javascript
复制
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;
}

最后,您还可以将术语和事实合并成一个参数(留作学生的练习)。

票数 2
EN

Stack Overflow用户

发布于 2016-08-17 17:27:06

您可以在双BigDecimal中创建一个新的

然后,您可以使用BigDecimal的乘法方法。

代码语言:javascript
复制
fct = fct.multiplie(new BigDecimal(doubleValue));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39002673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档