Karena itu adalah Pi hari baru-baru ini, saya telah melihat sebuah nomor dari tantangan yang meminta Anda untuk menghitung pi.
Tentu saja, quorum lorraine tidak terlalu banyak (Anda dapat mengklaim Skor Bonus¹ dari +1 jika Anda menebak tantangan di luar judul). Dengan demikian, tugas Anda adalah menulis algoritma atau metode yang kelihatannya mendekati Pi pada pandangan pertama, tetapi dijamin tidak akan menyatu ke arah Pi.
Ini adalah tantangan curang, jadi pastikan itu akan menghasilkan 3,14 ... untuk kasus uji sederhana, misalnya dengan 10 iterasi dari algoritma Anda. Ini juga merupakan tantangan popularitas, jadi jangan pergi untuk yang jelas echo(pi)
dan mengatakan bahwa IEEE 754 floating point rounds beberapa digit naik atau turun.
Pemenang mendapat quiche lorraine².
¹ Peringatan: sebenarnya bukan skor bonus. Dengan mengklaim skor, Anda setuju untuk membuatkan saya pai sebelum Pi Day, 2016
² Peringatan: quiche lorraine digunakan sebagai metafora karena jawaban Anda ditandai sebagai 'diterima'
sumber
Jawaban:
Algoritma
Menggunakan hasil yang terkenal:
kami mendefinisikan dengan Python 3:
Pengujian
Spoiler
sumber
Untuk menemukan pi, kami akan mengintegrasikan persamaan diferensial yang terkenal ini:
Dengan kondisi awal
Sudah diketahui bahwa masalah nilai awal ini konvergen menjadi π karena t bertambah tanpa batas. Jadi, yang kita butuhkan hanyalah memulai dengan tebakan yang masuk akal untuk sesuatu antara 0 dan 2π, dan kita dapat melakukan integrasi numerik. 3 dekat dengan π, jadi kami akan memilih y = 3 untuk memulai.
Berikut adalah beberapa hasil di setiap langkah untuk jumlah langkah yang berbeda:
Bagaimana itu bekerja:
sumber
n
? ...for
Deselerasi Anda digunakant
, tetapi loop Anda digunakann
.Kode:
Saya pada dasarnya menemukan urutan ini secara tidak sengaja. Ini dimulai sebagai
1, 1
dan setiap istilah setelah itus(n)
diberikan olehs(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. Hasil akhirnya adalah yang terkeciln
yangs(n) < 0
dikalikan dengan2m
. Semakinm
kecil, itu harus menjadi lebih dan lebih akurat.Saya cukup yakin ini adalah kesalahan floating point karena
(1 + m*m)
mendekati satu, tapi saya tidak yakin. Seperti yang saya katakan, saya sengaja menemukan ini. Saya tidak yakin dengan nama resminya. Jangan coba ini dengan yangm
terlalu kecil atau akan berjalan selamanya (jika1 + m*m == 1
karenam
terlalu kecil).Jika ada yang tahu nama urutan ini atau mengapa berperilaku seperti ini, saya akan sangat menghargainya.
sumber