Pi jest w błędzie
Powszechną metodą obliczania pi jest rzucanie „rzutkami” do pudełka 1x1 i sprawdzanie, który ląd w okręgu jednostki w porównaniu do całkowitej rzuconej:
loop
x = rand()
y = rand()
if(sqrt(x*x + y*y) <= 1) n++
t++
pi = 4.0*(n/t)
Napisz program, który wygląda tak, jakby poprawnie obliczał pi (używając tej lub innych typowych metod obliczania pi), ale zamiast tego oblicza tau (tau = 2 * pi = 6.283185307179586 ...). Twój kod musi generować co najmniej pierwsze 6 miejsc po przecinku: 6.283185
Zwycięzca zostaje koronowany 6 czerwca (za tydzień od dzisiaj).
popularity-contest
underhanded
pi
Kyle Kanos
źródło
źródło
1
ale zwraca2
. Kogo tu oszukujemy?Odpowiedzi:
JavaScript
Pomocy, jestem uwięziony w fabryce wszechświatów i nie jestem pewien, co robię.
Math.atan2
ma zwracać pi z dobrymi wartościami, prawda?Math.atan2(0, -0)
zwraca pi, więc jeśli go odejmę i dodam, nadal powinienem mieć pi.źródło
π - (-π)
>>> 0 === -0 ;true ;>>> Math.atan2(0, 0) ;0 ;>>> Math.atan2(0, -0) ;3.141592653589793
PODSTAWOWY
(Mówiąc dokładniej, Chipmunk Basic )
Wykorzystuje to nieskończoną serię odkrytą przez Nilakantha Somayaji w XV wieku:
Wydajność
Jeśli nie możesz dowiedzieć się, co się dzieje, oto kilka wskazówek:
i
źródło
i
równa sięfalse
? A potem dodajesz2
do tego? I to działa ???i == false
które są podobne doi == 0
. Chodzi o to, że początkowa wartość akumulatorapi
nie wynosi 0…false + 2 == 2
: Dbool
typu, i używa0
oraz niezerowe do reprezentowaniafalse
itrue
powtarzania. Nie dlatego, że jest elegancki, ale hej, tak to działa.C - Długość połowy koła jednostkowego
Jeden sposób obliczenia gatunku jest jedynie pomiar odległości punkt
(1, 0)
przemieszcza się podczas obracania wokół pochodzenie do(-1, 0)
ponieważ będzie połowę obwodu okręgu jednostkowym (co 2π ).Jednak nie jest konieczne
sin(x)
lub niecos(x)
, ponieważ można to zrobić, przechodząc dookoła początku i dodając odległość, jaką punkt pokonuje dla każdego kroku . Im mniejszy rozmiar dla każdego kroku, tym dokładniejszy będzie π .Uwaga: Stepping zakończy się, gdy y jest poniżej zera (czyli tak jak mija
(-1, 0)
).Daje następujące dane wyjściowe:
źródło
length
makrze brakuje sqrt. Czy to jest zamierzone?x
iy
są również zamieniane między definicją a wywołaniem (bez efektu)sqrt
został przypadkowo pominięty, więc wartość pi została wydrukowana jako 6,28 ... Również +1 za zauważenie,x
ay
czego nie!do
(W końcu było to dłuższe niż zamierzone, ale i tak opublikuję ...)
W XVII wieku Wallis opublikował nieskończoną serię dla Pi:
(Więcej informacji na temat π, e i √ (2 + √2), aby uzyskać więcej informacji, patrz Nowe nieskończone produkty typu Wallis i katalońskiego )
Teraz, aby obliczyć Pi, musimy najpierw pomnożyć przez dwa, aby wyliczyć mianownik:
Moje rozwiązanie oblicza następnie szereg nieskończony dla Pi / 2 i dwóch, a następnie mnoży te dwie wartości razem. Zauważ, że nieskończone produkty są niezwykle powolne w zbieraniu się podczas obliczania ostatecznych wartości.
wydajność:
źródło
Java - seria Nilakantha
Seria Nilakantha jest podawana jako:
Tak więc dla każdego terminu mianownik jest konstruowany przez pomnożenie kolejnych liczb całkowitych, przy czym początek rośnie o 2 za każdym razem. Zauważ, że dodajesz / odejmujesz na przemian terminy.
Po pięciuset terminach otrzymujemy rozsądne oszacowanie liczby pi:
źródło
C ++: Madhava z Sangamagrama
Ta nieskończona seria jest obecnie znana jako Madhava-Leibniz :
Zacznij od pierwiastka kwadratowego z 48 i pomnóż go przez wynik sumy (-3) -k / (2k + 1). Bardzo prosty i łatwy do wdrożenia:
Wydajność:
źródło
Python - alternatywa dla serii Nilakantha
To kolejna nieskończona seria do obliczenia pi, która jest dość łatwa do zrozumienia.
Dla tej formuły weź 6 i zacznij na przemian między dodawaniem i odejmowaniem ułamków z licznikami 2 i mianownikami, które są iloczynem dwóch kolejnych liczb całkowitych i ich sumy. Każda kolejna frakcja zaczyna swój zestaw liczb całkowitych rosnących o 1. Wykonaj to nawet kilka razy, a wyniki zbliżą się do pi.
co daje 6,283185.
źródło
Math.h:
Wyjście: 6,28
#include „Math.h” to nie to samo co #include, ale patrząc na główny plik, prawie nikt nie pomyślałby o sprawdzeniu. Być może oczywiste, ale podobny problem pojawił się w projekcie, nad którym pracowałem i przez długi czas pozostawał niewykryty.
źródło