python中的数值精度
我一直在用python做一些简单的数值实验,比如计算 阶乘。例如,计算32的阶乘: 我的日常工作:python中的数值精度,python,numerical-analysis,Python,Numerical Analysis,我一直在用python做一些简单的数值实验,比如计算 阶乘。例如,计算32的阶乘: 我的日常工作: 2.6313083693369503e+35 从scipy.misc: 2.6313083693369355e+35 我想指出,我的例程计算阶乘的对数, 它计算从1到32的对数总和(在本例中) 然后我只使用exp函数(我这样做是因为从 Fortran 90) 令人惊讶的是,正确的答案是 263130836933693530167218012160000000 根据pari/gp 如果有人能指
2.6313083693369503e+35
从scipy.misc:
2.6313083693369355e+35
我想指出,我的例程计算阶乘的对数,
它计算从1到32的对数总和(在本例中)
然后我只使用exp函数(我这样做是因为从
Fortran 90)
令人惊讶的是,正确的答案是
263130836933693530167218012160000000
根据pari/gp
如果有人能指出我可以寻找的参考资料,我会非常高兴
在Python中更正数字答案。文档是可以的,但只有在需要的时候
“短”数字。
log
和exp
函数在精度有限的浮点上运行。另一方面,Python的整数可以具有任意精度。所以,你可以用整数计算线性空间中32的阶乘
f = 1
for i in xrange(32):
f *= i + 1
print f # prints '263130836933693530167218012160000000'
您可以这样做:
import operator
n=32
print reduce(operator.__mul__,range(1,n+1))
# 263130836933693530167218012160000000
如果您能提供您的日常工作代码,我们将不胜感激。我不确定您在寻找什么。您使用
float
precision重新实现了math.factorial
,然后通过移入和移出日志空间来丢弃更高的精度,并在最后导致了几个数字的错误。Python与此无关,在fortran中使用双精度也会遇到同样的问题。如果您处理整数,Python会给您大整数,因此您可以强制精确计算阶乘。好的,很高兴知道这一点。使用浮点数的原因是一个数字的阶乘增长非常快,这就是为什么有时候用浮点数来计算它会更好。像我过去所经历的那样,用整数进行运算可能太幼稚了。@user2820579您必须决定:精度还是速度。你不能两者都有。浮动很快,因为它们的精度有限。正如@Hyperboreus所说,这是一种折衷。它将适合我的精度,因为我正在进行数值计算。另外:由于Gamma函数和阶乘函数对于中等大小的参数增长如此之快,因此许多计算环境中都包含一个函数,该函数返回Gamma函数的自然对数[。这就是为什么我尝试使用日志。。。