Chudnovsky算法(python)中的错误在哪里



我是python的新手(也是编码新手(,所以我正在学习一本教程。我试图使用书中概述的Chudnovsky算法将圆周率计算到小数位数;然而,当我执行代码时,我会得到一个错误:

> File "C:/Users/user/Documents/Python/Scripts/Tutorials/Calculating
> pi.py", line 15, in calc
> t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409 + 545140134*k) TypeError: 'decimal.Decimal' object cannot be interpreted
> as an integer

这是原始代码:

from decimal import Decimal, getcontext
import math

numberofdigits = int(input("please enter the number of decimal places to calculate Pi to: "))
getcontext().prec = numberofdigits

def calc(n):
t = Decimal(0)
pi = Decimal(0)
deno = Decimal(0)
k = 0
for k in range(n):
t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409+545140134*k)
deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k))
pi += Decimal(t)/Decimal(deno)
pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))
pi = 1/pi
return str(pi)


print (calc(1))

我哪里错了?我已经三次检查了拼写错误等,但没有发现任何错误,但我并不真正理解decimal.decimal类型的错误是什么意思。

编辑:我一直在玩它,发现如果我把分子的项分开,我会得到:

def calc(n): 
t = Decimal(0) 
pi = Decimal(0) 
deno = Decimal(0) 
k = 0 for k in range(n): 
u=(Decimal(-1)**k) 
x=(Decimal(6)*k) 
v=math.factorial(x) 
w=(13591409+545140134*k) 
t = u*v*w 
deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k)) 

这给了我以下错误:

第17行,在calc v=math.factorial(x(TypeError中:"decimal.decimal"对象不能被解释为整数

干杯

问题似乎是math.factorial()函数只接受整数或带有整数值的浮点,但不支持Decimal对象:

print(math.factorial(6))
# 720
print(math.factorial(6.0))
# 720
print(math.factorial(Decimal(6)))
# TypeError: 'decimal.Decimal' object cannot be interpreted as an integer

更改在第15行传递给math.factorial()的值应该可以修复错误:

t = (Decimal(-1)**k) * (math.factorial(6 * k)) * (13591409+545140134 * k)

有趣的是,您的原始代码使用Python 3.6.9运行良好,但在Python 3.8.2中失败了,因为这种行为是在Python 3.8中引入的(是的,这是预期的行为(。

通过阅读关于在math.factorial():中放弃对Decimal对象的支持的讨论,可以完全理解这种行为背后的逻辑

Issue 33083:math.factoral接受非整数Decimal实例

相关内容

最新更新