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

4

@SethMMorton によって強調表示された問題とは別に、式が間違っています。1 つ目は合計ではなく積であり、2 つ目は pi ではなく pi/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
于 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

追加するために、数式に非常に近いPythonicな方法でこれを行うことができます。(ここでは、.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 に答える