Desde que foi o dia do Pi recentemente, notei uma série de desafios que solicitam que você calcule o pi.
Obviamente, uma quiche lorraine não é exatamente uma torta (você pode reivindicar uma pontuação de bônus¹ de +1 se adivinhou o desafio do título). Como tal, seu trabalho é escrever um algoritmo ou método que pareça com o Pi à primeira vista, mas é garantido que não convergirá para o Pi.
Este é um desafio secreto, portanto, verifique se ele produzirá 3,14 ... para um caso de teste simples, por exemplo, com 10 iterações do seu algoritmo. Esse também é um desafio de popularidade; portanto, não vá pelo óbvio echo(pi)
e diga que o ponto flutuante IEEE 754 arredonda alguns dígitos para cima ou para baixo.
O vencedor ganha uma quiche lorraine².
¹ Aviso: na verdade não é uma pontuação de bônus. Ao reivindicar a pontuação, você concorda em me fazer uma torta antes do Dia do Pi, 2016
² Atenção: quiche lorraine é usada como uma metáfora para ter sua resposta marcada como 'aceita'
fonte
Respostas:
Algoritmo
Usando o resultado conhecido:
nós definimos em Python 3:
Testando
Spoiler
fonte
Para encontrar pi, integraremos esta conhecida equação diferencial:
Com uma condição inicial
É sabido que esse problema de valor inicial converge para π à medida que t aumenta sem limite. Portanto, tudo o que precisamos é começar com um palpite razoável para algo entre 0 e 2π, e podemos realizar a integração numérica. 3 está próximo de π, então escolheremos y = 3 para começar.
Aqui estão alguns resultados em cada um para diferentes números de etapas:
Como funciona:
fonte
n
...?for
desaceleração usat
, mas seu loop usan
.Código:
Eu basicamente descobri essa sequência por acidente. Começa como
1, 1
todos os termos após o ques(n)
é dado pors(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. O resultado final é o menorn
,s(n) < 0
multiplicado por2m
. À medida quem
diminui, deve ficar cada vez mais preciso.Tenho certeza de que esses erros de ponto flutuante
(1 + m*m)
se aproximam de um, mas não tenho certeza. Como eu disse, eu tropecei nisso por acidente. Não tenho certeza do nome oficial. Não tente fazer isso com umam
muito pequena ou ele vai correr para sempre (se1 + m*m == 1
devido am
ser tão pequeno).Se alguém souber o nome dessa sequência ou por que ela se comporta assim, eu agradeceria.
fonte