3
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 作为输出。有人可以告诉我我做错了什么。蟒蛇 2.7。

公式的链接在这里

4

6 回答 6

7

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

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

或者,正如@kindall 指出的那样,您可以直接将常量更改为浮点数并避免调用该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在等式中添加。)

于 2013-09-23T22:22:53.403 回答
4

除了@SethMMorton 强调的问题之外,您的公式是错误的。首先它是一个产品而不是总和,其次它给出的是 pi/2 而不是 pi。最后没有理由从 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
于 2013-09-23T22:35:12.870 回答
1

根据瓦利斯公式:

在此处输入图像描述

...并在 Python 3.4.2 中实现,总执行时间为~0.095sfor n = 100000

def wallis(n):
    pi = 0.0   
    for i in range(1, n):
        x = 4 * (i ** 2)
        y = x - 1
        z = float(x) / float(y)
        if (i == 1):
            pi = z
        else:
            pi *= z
    pi *= 2
    return pi

print(wallis(100000))
于 2014-11-25T16:31:38.343 回答
1

只是补充一点,您可以以一种看起来更接近数学表达式的 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))
于 2013-09-24T08:06:43.303 回答
0

另一个解决方案,使用列表内置函数和列表理解来获得最大的“pythonicness”:)

2 * reduce(lambda x, y: x*y, [(4.0*(i**2))/(4.0*(i**2)-1) for i in range (1, 1000000)])
于 2016-05-23T09:52:02.393 回答
-2
pi = 2
count = 0
    while True:
        count = count + 1
        tcount = count * 2
        pi = pi * (((tcount) / ((tcount) - 1)) * ((tcount) / (tcount + 1)))
        print(pi, count)
于 2020-04-30T17:02:40.837 回答