Pergunta

Até agora, parece que a equação base 2 de Fabrice Bellard é o caminho a percorrer

text alt

Ironicamente isso vai exigir um tipo BigReal; nós temos isso para .net? Net 4.0 tem BigInteger.

Alguém tem uma versão Haskell?

Foi útil?

Solução

Uma vez que você está pedindo uma versão Haskell, aqui é um papel por Jerzy Karczmarczuk, chamado "The Most técnica Não confiável do mundo para computação p":

Este artigo é um exercício atípico em codificação funcional preguiçoso, escrito para diversão e instrução. Ele pode ser lido e compreendida por qualquer pessoa que entende a linguagem de programação Haskell. Nós mostramos como implementar o fórmula Bailey-Borwein-Ploué para p numa co-recursiva, maneira gradual que produz os dígitos 3, 1, 4, 1, 5, 9.. . até que a memória exaustão. Esta não é uma forma de proceder se alguém precisa de muitos dígitos! Nossa estratégia de codificação é perversa e perigosa, e provably quebra. Baseia-se os aritmética sobre o domínio de sequências infinitas de dígitos representando frações próprias expandida numa base inteira. Mostramos como manipular: adicionar, multiplicar por uma número inteiro, etc tais sequências do esquerda para a direita ad infinitum, que, obviamente, não pode trabalhar em todos casos por causa de ambigüidades. Alguns profunda conseqüências filosóficas são discutido nas conclusões.

Realmente não resolver o problema de forma eficiente ou muito prático, mas é divertido e mostra alguns dos problemas com preguiça aritmética de precisão infinita.

Depois, há também este papel por Jeremy Gibbons .

Outras dicas

De longe o meu favorito torneira Haskell para pi vem de Jeremy Gibbons:

pi = g(1,0,1,1,3,3) where
    g(q,r,t,k,n,l) = 
        if 4*q+r-t<n*t
        then n : g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
        else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)

O fundo matemática que justifica que a implementação pode ser encontrada em:

um algoritmo Spigot para os dígitos de pi

Wikipedia detalha uma série de maneiras de obter aproximações numéricas de pi aqui . Eles também dar algum pseudo-código de exemplo

Edit: Se você está interessado neste tipo de problemas matemáticos, sem ter qualquer problema do mundo real relacionado para resolver (que é definitivamente uma boa atitude a ter, IMHO), você pode visitar o página Euler Projeto

Não existe essa possibilidade de processar números racionais grandes em DLR baseado linguagens dinâmicas (por exemplo, IronPython ). Ou você pode usar qualquer C portátil / implementação C ++ de grandes números reais através P / Invoke .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top