当前位置: 首页 > 知识库问答 >
问题:

Python圆周率计算?

丁理
2023-03-14

这是我的代码:

from math import factorial
from decimal import Decimal, getcontext

getcontext().prec=100

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

print calc(25)

由于某种原因,与可接受值相比,这段代码只产生了小数15位的pi值。我试图通过增加精度值来解决这一点;这增加了位数,但只有前15个仍然是准确的。我试着改变它计算算法的方式,它也不起作用。所以我的问题是,是否可以对这段代码做些什么来使它更加精确,或者我必须使用另一种算法?我将非常感谢对此的帮助,因为我不知道如何在Python中使用这么多的数字进行操作。我希望能够控制程序确定和显示的(正确的)数字的数量--无论是10,100,1000等等。

共有1个答案

林意蕴
2023-03-14

看来你在这一行上正在失去精确性:

pi = pi * Decimal(12)/Decimal(640320**(1.5))

请尝试使用:

pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))

发生这种情况的原因是,尽管Python可以处理任意比例的整数,但它对浮点的处理不是很好。

from decimal import Decimal, getcontext
getcontext().prec=100
print sum(1/Decimal(16)**k * 
          (Decimal(4)/(8*k+1) - 
           Decimal(2)/(8*k+4) - 
           Decimal(1)/(8*k+5) -
           Decimal(1)/(8*k+6)) for k in range(100))
 类似资料:
  • 本文向大家介绍Java小程序计算圆周率代码,包括了Java小程序计算圆周率代码的使用技巧和注意事项,需要的朋友参考一下 下面我们来介绍两种Java编程中实现计算圆周率的方法。 方法一:割圆法 计算公式为: π≈3*2^n*y_n 其中,n代表割圆次数,y_n代表圆中内嵌正6*n边形的边长 输出结果: 方法二:无穷级数法 求圆周率π的级数公式为: Π=2*(1/1+1/3+1/3*2/5+1/3+2

  • 随机字符串应该是不可压缩的。 随机十六进制字符串也会被显著压缩。然而,随机字节字符串不会被压缩。 pi字符串只包含字节48到57。如果整数上有前缀代码,则该字符串可能会被严重压缩。本质上,我是在浪费空间,用字节表示9个不同的字符(十六进制字符串是16个)。这是怎么回事? 有人能给我解释一下基本方法是什么,或者给我指出一些来源吗?

  • 本文向大家介绍Java 蒙特卡洛算法求圆周率近似值实例详解,包括了Java 蒙特卡洛算法求圆周率近似值实例详解的使用技巧和注意事项,需要的朋友参考一下 起源  [1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metrop

  • 编辑:我刚刚删除了其他的方法,我们已经验证是正确的,因为问题似乎有点长,这些方法似乎是无关的。 我有一个circle类,它有以下属性:中心、半径、旧位置、加速度、质量和恢复。 如果你接受向量方法的表面价值是正确的,这会有帮助,我认为它们的命名足够好,让你弄清楚它们的作用,但我也可以把它们粘贴进去。 我的主要问题是,当我运行它时,它注册了一个碰撞发生了,但是第二个圆圈的值位置没有改变。我将如何解决这

  • 问题内容: 我用SimpleDateFormat得到一些令人费解的结果,并希望有人可以阐明这个问题。输出: 我是否应该将一年的最后一个“周”视为特例?还是这是正确的解释方式?显然,当尝试顺序组织一周时,顺序是不正确的。调整初始值后,2005年12月25日被视为第53周。我还没有看过Joda,看看Joda是否产生类似的结果。 相关代码: 背景:我在JasperReports中使用交叉表(分组为星期的

  • 问题内容: 我有以下代码。我知道我可以使用函数过滤掉少于频率计数的搭配。但是,在决定设置过滤频率之前,我不知道如何获取文档中所有n- gram元组(在我的情况下为bi-gram)的频率。如您所见,我正在使用nltk搭配类。 问题答案: 该功能有效