Ponieważ było Pi dni niedawno, ja zauważyłem jak wiele z wyzwań , które proszą Cię do obliczenia PI.
Oczywiście, quiche Lorraine nie jest całkiem ciastem (możesz zdobyć wynik bonusowy¹ +1, jeśli odgadłeś wyzwanie z tytułu). W związku z tym Twoim zadaniem jest napisanie algorytmu lub metody, która na pierwszy rzut oka będzie wyglądała tak, jakby była zbliżona do Pi, ale z pewnością nie zbliży się do Pi.
Jest to trudne zadanie, więc upewnij się, że wyświetli 3.14 ... dla prostego przypadku testowego, np. Z 10 iteracjami twojego algorytmu. To także wyzwanie popularności, więc nie idź za oczywistością echo(pi)
i powiedz, że zmiennoprzecinkowe IEEE 754 zaokrągla niektóre cyfry w górę lub w dół.
Zwycięzca dostaje quiche Lorraine².
¹ Ostrzeżenie: tak naprawdę nie jest to wynik bonusowy. Podejmując decyzję, zgadzasz się upiec mi ciasto przed Świętem Pi 2016
² Ostrzeżenie: quiche Lorraine służy jako metafora oznaczenia odpowiedzi jako „zaakceptowana”
źródło
Odpowiedzi:
Algorytm
Korzystając ze znanego wyniku:
definiujemy w Pythonie 3:
Testowanie
Spojler
źródło
Aby znaleźć pi, zintegrujemy to dobrze znane równanie różniczkowe:
Z warunkiem początkowym
Dobrze wiadomo, że ten problem z wartością początkową zbiega się do π, gdy t wzrasta bez ograniczeń. Tak więc wszystko, czego potrzebujemy, to zacząć od rozsądnego odgadnięcia czegoś między 0 a 2π, i możemy przeprowadzić integrację numeryczną. 3 jest bliskie π, więc wybierzemy y = 3, aby rozpocząć.
Oto kilka wyników dla każdej liczby kroków:
Jak to działa:
źródło
n
? ...for
spowolnienie używat
, ale twoja pętla używan
.Kod:
Zasadniczo odkryłem tę sekwencję przez przypadek. Zaczyna się jak
1, 1
i każdy kolejny termins(n)
podany przezs(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. Wynik końcowy jest najmniejszyn
is(n) < 0
pomnożony przez2m
. W miaręm
zmniejszania się, powinno być coraz bardziej dokładne.Jestem prawie pewien, że są to błędy zmiennoprzecinkowe
(1 + m*m)
zbliżające się do jednego, ale nie jestem pewien. Tak jak powiedziałem, natknąłem się na to przez przypadek. Nie jestem pewien jego oficjalnej nazwy. Nie próbuj tego ze związkiemm
zbyt małe lub będzie działać zawsze (jeśli1 + m*m == 1
ze względu nam
bycie tak małe).Jeśli ktoś zna nazwę tej sekwencji lub dlaczego tak się zachowuje, byłbym wdzięczny.
źródło