【问题标题】:Numerical precision in pythonpython中的数值精度
【发布时间】:2013-10-30 15:58:08
【问题描述】:

我一直在用 python 做简单的数值实验,比如计算 阶乘。例如,计算 32 的阶乘:

我的日常:

2.6313083693369503e+35

来自 scipy.misc:

2.6313083693369355e+35

我想指出我的例程计算阶乘的对数, 它计算从 1 到 32 的对数之和(在这种情况下) 然后我只使用 exp 函数(我这样做是因为从 Fortran 90)。

令人惊讶的是正确答案是

263130836933693530167218012160000000

根据pari/gp。

如果有人能指出我可以寻找的参考资料,我会非常高兴 Python 中的正确数字答案。文档没问题,但只有在需要时 “短”数字。

【问题讨论】:

  • 如果您能提供您的例程代码,我们将不胜感激。
  • 我不确定您在寻找什么。您使用float 精度重新实现了math.factorial,然后通过移入和移出日志空间来提高精度,最后得到几位数的错误。 Python 与此无关,在 fortran 中使用双精度也会遇到同样的问题。
  • 如果您正在处理整数,python 会为您提供大整数,因此您可以精确计算阶乘。

标签: python numerical-analysis


【解决方案1】:

logexp 函数在精度有限的浮点上运行。另一方面,Python 的整数可以具有任意精度。因此,您可以使用整数很好地计算线性空间中 32 的阶乘。

f = 1
for i in xrange(32):
    f *= i + 1
print f  # prints '263130836933693530167218012160000000'

【讨论】:

  • 好的,很高兴知道这一点。使用浮点数的原因是数字的阶乘增长非常快,这就是为什么有时用浮点数计算它更好。正如我过去所经历的那样,用整数做它们可能太天真了。
  • @user2820579 您必须做出决定:精度还是速度。你不能两者兼得。
  • 浮点数很快,因为它们的精度有限。正如@Hyperboreus 所说,这是一种权衡。
  • 它适合我的精度,因为我正在做数值计算。另外:由于 Gamma 和阶乘函数对于中等大小的参数增长如此之快,因此许多计算环境都包含一个返回 gamma 函数的自然对数的函数 [en.wikipedia.org/wiki/Gamma_function].这就是我尝试日志的原因...
【解决方案2】:

你可以这样做:

import operator
n=32
print reduce(operator.__mul__,range(1,n+1))
# 263130836933693530167218012160000000

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2014-02-08
    • 1970-01-01
    • 2021-04-16
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多