圆周率的Wallis公式

2024-10-02 18:26:33 发布

您现在位置:Python中文网/ 问答频道 /正文

def wallis(n):
    pi = 0.0

    for i in range(n):
        left = (2 * i)/(2 * i - 1)
        right = (2 * i)/(2 * i + 1)
        total = left * right
        pi = pi + total

    return pi

print wallis(1000)
print wallis(10000)
print wallis(100000)

我准确地复制了公式,但我一直得到0作为输出。有人能告诉我我做错了什么吗。Python2.7。

公式的链接是here


Tags: inrightforreturnhere链接defpi
3条回答

只是补充一点,你可以用一种Python的方式来做这件事,看起来也更接近数学表达式。(这里.25负责浮点转换)

def product(iterator):
    return reduce(lambda x, y: x * y, iterator)

print 2 * product(i * i / (i * i - .25) for i in xrange(1, 1000))

Python正在进行整数除法,并截断小数。这是因为要除法的两个值都是整数。将其中一个数字转换为浮点数以获取浮点值。

left = float(2 * i)/(2 * i - 1)
right = float(2 * i)/(2 * i + 1)

或者,正如@kindall指出的,您可以将常量直接更改为float,并避免调用float函数:

left = (2.0 * i)/(2 * i - 1) # just 2. works, too
right = (2.0 * i)/(2 * i + 1)

如果/当您切换到python 3.x时,就不需要这样做了。实际上,您需要用//显式请求整数除法。

根据@Serdalis的注释,您还可以在文件顶部添加from __future__ import division,以获得与python 3.x相同的行为(即,您不需要在等式中添加float

除了@SethMMorton强调的问题外,您的公式是错误的。首先它是一个积而不是和,其次它给出的是π/2而不是π。最后没有理由从0循环。

def wallis(n):
    pi = 2.
    for i in xrange(1, n):
        left = (2. * i)/(2. * i - 1.)
        right = (2. * i)/(2. * i + 1.)
        pi = pi * left * right
    return pi

相关问题 更多 >