ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

Haskell で 連分数展開を使って π を求める

πの求め方


こう書いてもおk


import Text.Printf
import Control.Monad

-- 自作の逆正接関数
myAtan::Double->Double->Int->Double->Double
myAtan x x2 n t =
let
    m     = (fromIntegral (n `div` 2))
    denom = (m * m * x2) / ((fromIntegral n) + t)
    num   = n - 2
in 
    if num <= 1 then
        x / (1.0 + denom)
    else
        myAtan x x2 num denom

forM_ (
    map (\n -> n * 2 + 1) $ 
    [5..15::Int]
) $ \i -> do -- 11..31
    let radian = 1
    let x2 = radian * radian
    -- 自作の逆正接関数
    let d1 = (myAtan radian x2 i 0.0) -- i:必要な精度が得られる十分大きな奇数
    -- 標準関数との差異
    printf "%2d : %13.10f, %13.10f\n" i (d1 * 4) (d1 * 4 - pi)
11 :  3.1414634146, -0.0001292390
13 :  3.1416149068,  0.0000222532
15 :  3.1415888251, -0.0000038285
17 :  3.1415933119,  0.0000006583
19 :  3.1415925404, -0.0000001131
21 :  3.1415926730,  0.0000000194
23 :  3.1415926503, -0.0000000033
25 :  3.1415926542,  0.0000000006
27 :  3.1415926535, -0.0000000001
29 :  3.1415926536,  0.0000000000
31 :  3.1415926536, -0.0000000000
参考文献