Haskell で 連分数展開を使って π を求める
πの求め方
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
参考文献