Python 3.x Chudnovsky算法(python)中的错误在哪里?

Python 3.x Chudnovsky算法(python)中的错误在哪里?,python-3.x,pi,Python 3.x,Pi,我是python新手(也不熟悉编码),所以我正在学习一本教程。我试图使用Chudnovsky算法,根据书中概述的代码,将pi计算到小数位数;但是,当我执行代码时,会出现一个错误,错误是: > File "C:/Users/user/Documents/Python/Scripts/Tutorials/Calculating > pi.py", line 15, in calc > t = (Decimal(-1)**k)*(math.factorial(De

我是python新手(也不熟悉编码),所以我正在学习一本教程。我试图使用Chudnovsky算法,根据书中概述的代码,将pi计算到小数位数;但是,当我执行代码时,会出现一个错误,错误是:

> 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()
函数只接受整数或带整数值的浮点,但不支持
十进制
对象:

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)
有趣的是,您的原始代码在使用Python3.6.9时运行良好,但在Python3.8.2中失败,因为此行为是在Python3.8中引入的(是的,这是预期的行为)

阅读关于在
math.factorial()
中放弃对十进制对象的支持的讨论,可以完全理解此行为背后的逻辑:


您使用的是什么输入?你的代码对我来说没有任何错误。我只输入10或20作为输入,没有什么可笑的。这是一个常见的与decimal.decimal有关的“类型错误”吗?可能是因为生成浮点和想要生成整数之间存在某种不一致吗?这很奇怪。这看起来像是iPython笔记本电脑的问题,Github上对此进行了讨论:好的,我想我已经解决了,如果我的答案有帮助,请告诉我。是的,这解决了问题。非常感谢您的帮助:)很高兴我能帮助您,这实际上是一个有趣的问题,接得好!我很高兴这与python有关,而不是我的无能,现在我可以完成该教程的其余部分了