我正在Android中开发一个计算器应用程序。
我开发了计算器,除了阶乘函数外,它运行良好。
计算阶乘的函数是:
public float factorial (float n){
float ans=1;
for (int i=1; i<=n; i++){
ans=ans*i;
}
return ans;
}
问题是,直到34!
我认为我得到了正确答案。
34!=2.952328229965333E38
然而对于n>=35
,我得到答案
n!=Infinity
我意识到这是因为浮动溢出。
如何将float
的范围增加至少10^100.
谢谢。
答案 0 :(得分:4)
您无法增加任何Java基元类型的范围,因为它们是在JLS中设置的。 在你的情况下,你可以使用double来获得更多的范围,或者使用BigDecimal来获得任意大的数字
答案 1 :(得分:2)
如果你不介意绝对精度,你可以使用双精度,它可以与(近似)1.8 * 10^308
一样大。
如果关注精度,则应使用BigDecimal或BigInteger(factorial是一个整数函数,在这种情况下BigInteger可能比BigDecimal更有效)。
答案 2 :(得分:2)
使用double
代替float
扩展浮点范围。
如果需要考虑精度,则不应使用浮点类型。既不double
也不float
。使用BigInteger。但在这种情况下,还要解决您的问题:34 != 2.952328229965333E38
不是正确答案。
答案 3 :(得分:1)
无需为像阶乘函数那样简单的事情重新发明轮子。
使用Google's Guava library。 Youtube 和 Google搜索等Android应用(来自Google本身)使用Guava。
double f = DoubleMath.factorial(n);
它接受n = 170的输入,超过该输入返回Double.POSITIVE_INFINITY
。