Cálculo de pi mediante la fórmula de Beeler
El pasado 12 de marzo se publicó en Twitter un mensaje con una fórmula de Beeler para el cálculo de pi
Los primeros valores son
1 2 3 4 5 6 7 8 9 10 |
λ> 2*1 2 λ> 2*(1+1/3) 2.6666666666666665 λ> 2*(1+1/3+(1*2)/(3*5)) 2.933333333333333 λ> 2*(1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)) 3.0476190476190474 λ> 2*(1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+(1*2*3*4)/(3*5*7*9)) 3.098412698412698 |
Definir las funciones
1 2 |
aproximacionPi :: Int -> Double grafica :: [Int] -> IO () |
tales que
- (aproximacionPi n) es la n-ésima aproximación de pi con la fórmula de Beeler. Por ejemplo,
1 2 3 4 5 6 7 8 |
aproximacionPi 0 == 2.0 aproximacionPi 1 == 2.6666666666666665 aproximacionPi 2 == 2.933333333333333 aproximacionPi 3 == 3.0476190476190474 aproximacionPi 4 == 3.098412698412698 aproximacionPi 10 == 3.141106021601377 aproximacionPi 100 == 3.1415926535897922 pi == 3.141592653589793 |
- (grafica xs) dibuja la gráfica de las k-ésimas aproximaciones de pi para k en xs. Por ejemplo, (grafica [0..99]) dibuja
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Graphics.Gnuplot.Simple (Attribute (Key, PNG), plotList) aproximacionPi :: Int -> Double aproximacionPi n = aproximacionesPi !! n aproximacionesPi :: [Double] aproximacionesPi = map (*2) (scanl1 (+) (1 : scanl1 (*) [(x/y) | (x,y) <- zip [1..] [3,5..]])) -- Gráfica -- ======= grafica :: [Int] -> IO () grafica xs = plotList [ Key Nothing -- , PNG "Calculo_de_pi_mediante_la_formula_de_Beeler_1.png" ] [(k,aproximacionPi k) | k <- xs] |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
3 Comentarios