Java 如何使我的阶乘方法使用小数?(伽马)
我有一个方法返回输入的阶乘。它适用于整数,但我不知道如何使它适用于十进制数 以下是我目前的方法:Java 如何使我的阶乘方法使用小数?(伽马),java,math,Java,Math,我有一个方法返回输入的阶乘。它适用于整数,但我不知道如何使它适用于十进制数 以下是我目前的方法: public static double factorial(double d) { if (d == 0.0) { return 1.0; } double abs = Math.abs(d); double decimal = abs - Math.floor(abs); double result = 1.0; for
public static double factorial(double d)
{
if (d == 0.0)
{
return 1.0;
}
double abs = Math.abs(d);
double decimal = abs - Math.floor(abs);
double result = 1.0;
for (double i = Math.floor(abs); i > decimal; --i)
{
result *= (i + decimal);
}
if (d < 0.0)
{
result = -result;
}
return result;
}
公共静态双阶乘(双d)
{
如果(d==0.0)
{
返回1.0;
}
双abs=数学abs(d);
双十进制=绝对值-数学楼层(绝对值);
双结果=1.0;
for(双i=数学地板(abs);i>十进制;--i)
{
结果*=(i+小数);
}
如果(d<0.0)
{
结果=-结果;
}
返回结果;
}
我找到了一个实现,但没有显示代码(我丢失了链接),给出的示例是5.5!=5.5 * 4.5 * 3.5 * 2.5 * 1.5*0.5! = 287.885278
因此,根据这个模式,我只是将十进制值添加到for循环的result*=(I+decimal)
但很明显,我的逻辑是有缺陷的
编辑:刚刚重新设定最后一个值为0.5!,不是0.5。这一切都不同。所以
0.5!=0.88622和5.5
=5.5*4.5*3.5*2.5*1.5*0.88622
等于287.883028125
阶乘实际上不是为x€R定义的,只是为x€N定义的。换句话说:你不能计算十进制的阶乘。(您可以选择5.0版,但不能选择5.1版)
编辑:这是“传统”阶乘的视图,对于(实际上很少需要的)十进制阶乘,请参阅“gamma函数”。将阶乘推广到实数的方法很难直接实现。使用一个库,例如为您计算它,或了解所涉及的内容。一旦可用,请按如下方式使用:
public static double generalizedFactorial(double d) {
// Gamma(n) = (n-1)! for integer n
return Gamma.gamma(d+1);
}
产出:
4.0! = 24.0
5.5! = 287.88527781504433
6.0! = 720.0
4.0! = 24.0
5.5! = 487.265625
6.0! = 720.0
前面的答案(为大于1的实数提供了类似于阶乘的解释;但由于阶乘扩展到实数时已经存在聚合,请忽略这一点):
产出:
4.0! = 24.0
5.5! = 287.88527781504433
6.0! = 720.0
4.0! = 24.0
5.5! = 487.265625
6.0! = 720.0
那么,您的实现提供了什么,您做了什么来诊断发生了什么?对于“阶乘的浮点版本”,Gamma函数可能意味着什么。完全不同的方法。看,代码中的逻辑不是有缺陷的。有缺陷的是你的假设,阶乘方法应该是有意义的小数。但这种方法被定义为适用于整个正数;没有别的。根据这种解释,5.001!=5.001*4.001*3.001*2.001*1.001*0.001=0.1202;预期5.001!>5!代码>嗯。。。好吧,这是有道理的。我想逻辑是完全错误的,所以根本不可能?当你输入3.2时,谷歌计算器怎么会给出一个结果呢!例如当然,如果这是不可能的,结果将是“错误”-编辑:好的,我以前没有听说过伽马函数。。。我猜这就是google calculator使用的。你可以把它看作两个不同的“阶乘”,1是传统的函数,通常是需要的(例如组合数学),而不是为小数定义的。如果你真的想做的话,你需要的东西叫做“伽马函数”。这是先进的东西。你确定你需要吗?阶乘是为双精度定义的;该实现与朴素的整数实现无关。您需要查看gamma函数:gamma(n)=(n-1)!看,嗯。。。有意思,你能解释一下这背后的数学吗?此外,谷歌计算器输出不同的小数值。例如,3.5!在google calculator中是11.6317283966,您的代码输出19.6875。这并没有实现gamma函数(其中G(n)=(n-1)!
表示整数n
)-相反,要得到f(n)=n是一个难题
用于整数,而f(r1)
用于1
。如果您需要google完整性的实际gamma函数,请使用库-例如。