ぱい

super pi を作ろう – ぴょぴょぴょ? – Linuxとかプログラミングの覚え書き –

というのを見つけた。
正直よく解らないけど(だから素人のままなんだ…)
super pi みたいなのを自作するのは面白そう、もっと勉強せねば。

とにかく Python でπの無限出力はどうすればいいのだろう?
スクリプト言語はこの手の計算は不得意だと解っているけどやってみたい。

math.pi では小数点以下 16 桁までしか出力してくれないし。

B. 浮動小数点演算、その問題と制限

ということで Web を探す。
とにかく例の一つでもないと私のような素人はさっぱり解らない。

情報処理 II, 第6回

簡単に見つかった…
早速 circleratio.py というのを落として実験。
エンコードが何故に latin-1 ? utf-8 に変更しておこう。

print はきちんと括弧でくくったのに例外出まくリング…

そういえば Python 3 って他にも沢山変わっていたんだっけか。

特集:もっと知りたいPython3000|gihyo.jp … 技術評論社

input() は eval(input()) にしないと文字列になるので書き換えて。
/ は // にしないと float になっちゃうので書き換えて。

#!/bin/env python
#-*- coding: utf-8 -*-
# 2007.4.9
#
# ガウスの公式による円周率の計算

from math import *  # 数学関数を使うためのまじない
from time import *  # 時間関数を使うためのまじない
from sys import *   # システム関数を使うためのまじない

# arctan(1/n) の小数展開
def expansion(n):
    x = ( p * q ) // n
    nn = n * n
    c = 1
    s = x
    k = 1
    while x > 0:
        x = x // nn
        k = k + 2
        c = - c
        s = s + c * ( x // k )
    return s

print ('円周率を計算します。')
print ('桁数を指定してください。')
prsn = eval(input())

t0 = time()     # 開始時刻
p = 10**prsn
q = 10**10

y = 4 * ( 12 * expansion(18) + 8 * expansion(57) - 5 * expansion(239) )
y = y // q
u = y // p
v = y - u * p
t1 = time()     # 終了時刻

print ("%d.%d" % (u,v))
print ('計算時間 =', t1 - t0)
fin = stdin.readline()  # Enter キーで終了

メンドクセ!
40 行のコードでコレでは大きなプログラムはマジ大変だろうなぁ。

そういえば math,time,sys は IronPython にも組み込まれているはずだよなぁ。
やってみたら一行目を消さなきゃエンコードを認識しないかやはり。
Linux の IronPython は何故か imput() ができなのでパス。

pi

IronPython 遅っ!
コンマ付きの print もおかしいし、やはり普通の Python 代わりは無理だわ。

しかし実行中は見事にデュアルコア CPU の 50 %利用ってのが笑えるよ。
ちなみに AMD Athlon64 X2 4200+ と AMD 690G というショボい構成のまま。

picpu

十万桁に 89 秒も掛かった、百万桁なんて恐ろしくて出来ん。
つか、こういうのはやはり C 言語でやるべきだよと。