Java 该程序对大于120?的m值抛出无穷大?。。能解决吗? for(int i=n+1;i

Java 该程序对大于120?的m值抛出无穷大?。。能解决吗? for(int i=n+1;i,java,arrays,markov-chains,computation,Java,Arrays,Markov Chains,Computation,您正在将BigDecimal的结果解析回一个double。如果BigDecimal太大,则该值就是无限的,因为该double无法保存那么多数据 编辑:无穷大错误也可能发生在代码中的其他某个点上,并且错误只是传播。只需检查从BigDecimal到Double的不必要的强制转换。可以解决什么问题吗?您希望它做什么?仅代码问题不受欢迎。提供预期行为的描述,以及您得到的错误。您应该添加一个l更多信息。就像你想做的。好吧,120!会溢出,它是6.6x10^198。包含你的factorial方法怎么样?当你

您正在将BigDecimal的结果解析回一个double。如果BigDecimal太大,则该值就是无限的,因为该double无法保存那么多数据


编辑:无穷大错误也可能发生在代码中的其他某个点上,并且错误只是传播。只需检查从BigDecimal到Double的不必要的强制转换。

可以解决什么问题吗?您希望它做什么?仅代码问题不受欢迎。提供预期行为的描述,以及您得到的错误。您应该添加一个l更多信息。就像你想做的。好吧,
120!
会溢出,它是6.6x10^198。包含你的
factorial
方法怎么样?当你把一个factorial除以另一个时,你不需要完全计算它们的双精度=(Math.pow(r,i))*(fact(m)/(fact(m-i)*(fact)(i))*((Math.pow(n,n-i)*fact(i))/fact(n))这是我实现的公式,正如你所看到的,但它在120以上无穷大。我在没有解析的情况下尝试了它,它给了我值,但对于最终的计算,它不起作用。除了避免解析之外,你知道如何做吗?你使用的是Math.pow,它“仅”使用双精度计算。如果要使用较大的数字进行计算,请使用BigDecimal。您必须将代码转换为使用BigDecimals。例如,您可以使用
BigDecimal powedNumber=new BigDecimal(20)。pow(1000);
到pow 20 x 1000。此计算的结果太大,无法放入双精度。您可以使用BigDecimal执行其他计算,例如乘法、除法、加。。。
for(int i=n+1;i<=m;i++){
            double r =  (lm/mu);
//          double res = (Math.pow(r, i))*(fact(m)/(fact(m-i)*fact(i)))*((Math.pow(n, n-i)*fact(i))/fact(n)) formulae
            BigDecimal lr= new BigDecimal(Math.pow(r, i));
            BigDecimal fnum = new BigDecimal(factorial(m));
            BigDecimal fden1 = new BigDecimal(factorial(m-i));
            BigDecimal fden2 = new BigDecimal(factorial(i));
            fden1=fden1.multiply(fden2);
            fnum=fnum.divide(fden1);
            lr=lr.multiply(fnum);
            BigDecimal nden = new BigDecimal(factorial(n));
            BigDecimal inum = new BigDecimal(factorial(i));
            BigDecimal mnum = new BigDecimal(Math.pow(n, n-i));
            mnum = mnum.multiply(inum);
            mnum = mnum.divide(nden);
            lr = lr.multiply(mnum);
            ssum2 = ssum2.add(lr);
            sum2=Double.parseDouble(format(ssum2,40));

}

System.out.println("Total 2 is"+sum2);