Python: 如何以十进制格式表达阶乘的除法?
我正在尝试获取拉盖尔多项式的系数,这个过程涉及到阶乘的除法,这是我的代码:
Coeficientes=[]
def Ln(n):
for m in xrange(n+1):
Coeficientes.append(((-1)**m *factorial(n))/(factorial(n-m)*factorial(m)*factorial(m)))
print "Coeficiente de grado", m, ":", Coeficientes[m]
问题是,当我想得到值为0.5的系数时,却得到了0。
举个例子:
Ln(2)
结果:
Coeficiente de grado 0 : 1
Coeficiente de grado 1 : -2
Coeficiente de grado 2 : 0
但应该是:
Coeficiente de grado 2 : 0.5
如果我写Ln(2.),就会返回一个错误:期望整数参数,但得到了浮点数。
3 个回答
0
你需要把其中一个数字转换成浮点数,这样才能防止所有的数字都被当作整数来处理。比如可以用 (-1)**float(m)
或者 (-1.0)**m
。
Coeficientes=[]
def Ln(n):
for m in xrange(n+1):
Coeficientes.append(((-1)**float(m) *factorial(n))/(factorial(n-m)*factorial(m)*factorial(m)))
print "Coeficiente de grado", m, ":", Coeficientes[m]
在用整数进行除法运算时,Python会把结果当作整数来处理。例如,7/5
的结果是 1
。但是如果你用 7.0/5
,结果就是 1.4
了。
使用小数(Decimal)会更准确,可以避免一些四舍五入的错误。想了解更多,可以看看这个链接:https://docs.python.org/2/tutorial/floatingpoint.html
1
你的问题出在 factorial
这个函数上。这个函数只能处理正整数。如果你想计算任何实数(包括非整数和整数),应该使用 math.gamma(n)
。
下面是一个示例代码:
from math import gamma
print (((-1)**m *gamma(n))/(gamma(n-m)*gamma(m)*gamma(m)))
1
你得到的 Coeficiente de grado 2 : 0
而不是 Coeficiente de grado 2 : 0.5
是因为 factorial
这个函数只接受整数。如果你想用其他方法,可以使用 math.gamma(x)
。
gamma
是对阶乘函数的一个扩展,可以处理实数。(如果你使用的是 Python 2.7 或 3.2 版本)
可以查看 这里的文档。