Bagaimana cara saya menentukan apakah perhitungan pi saya akurat?


772

Saya mencoba berbagai metode untuk mengimplementasikan program yang memberikan angka pi secara berurutan. Saya mencoba metode seri Taylor , tetapi terbukti konvergen sangat lambat (ketika saya membandingkan hasil saya dengan nilai online setelah beberapa waktu). Lagi pula, saya mencoba algoritma yang lebih baik.

Jadi, ketika menulis program saya terjebak pada masalah, seperti semua algoritma: Bagaimana saya tahu bahwa nangka yang saya hitung akurat?


20
lebih dari masalah matematika. algoritma yang baik juga memberikan estimasi kesalahan.
contoh

35
Bandingkan dengan pi?
Dave Newton

55
@ Chris: "Secara harfiah di mana-mana"?
Lightness Races di Orbit

32
Saya dapat memeriksa Anda hingga 3.141592653589793238462643383279502, lebih dari itu, mengapa Anda membutuhkan jumlah digit yang begitu besar? (Itu seperti akurasi tingkat atom dengan lingkaran seukuran alam semesta.)
AJ Henderson

65
Mengapa Anda tidak membaginya dengan pi dan memeriksa apakah hasilnya 1? (just kidding)
user541686

Jawaban:


1629

Karena saya pemegang rekor dunia saat ini untuk digit pi terbanyak, saya akan menambahkan dua sen saya :

Kecuali jika Anda benar-benar membuat rekor dunia baru, praktik yang umum adalah hanya memverifikasi angka yang dihitung terhadap nilai yang diketahui. Jadi itu cukup sederhana.

Bahkan, saya memiliki halaman web yang mencantumkan snippet of digit untuk tujuan memverifikasi perhitungan terhadap mereka: http://www.numberworld.org/digits/Pi/


Tetapi ketika Anda masuk ke wilayah rekor dunia, tidak ada yang bisa dibandingkan.

Secara historis, pendekatan standar untuk memverifikasi bahwa digit yang dihitung benar adalah untuk menghitung ulang digit menggunakan algoritma kedua. Jadi, jika salah satu perhitungan memburuk, angka pada akhirnya tidak akan cocok.

Ini biasanya lebih dari dua kali lipat jumlah waktu yang dibutuhkan (karena algoritma kedua biasanya lebih lambat). Tapi itu satu-satunya cara untuk memverifikasi angka yang dihitung setelah Anda berkeliaran di wilayah yang belum dipetakan dengan angka yang belum pernah dihitung sebelumnya dan rekor dunia baru.


Kembali pada hari-hari di mana superkomputer mengatur catatan, dua algoritma AGM yang umum digunakan:

Ini adalah kedua O(N log(N)^2)algoritma yang cukup mudah diimplementasikan.

Namun, saat ini, segalanya agak berbeda. Dalam tiga rekor dunia terakhir, alih-alih melakukan dua perhitungan, kami hanya melakukan satu perhitungan menggunakan rumus yang paling cepat dikenal ( Formula Chudnovsky ):

Masukkan deskripsi gambar di sini

Algoritma ini jauh lebih sulit untuk diterapkan, tetapi jauh lebih cepat daripada algoritma AGM.

Kemudian kami memverifikasi angka biner menggunakan rumus BBP untuk ekstraksi digit .

Masukkan deskripsi gambar di sini

Rumus ini memungkinkan Anda untuk menghitung angka biner acak tanpa menghitung semua angka sebelumnya. Jadi ini digunakan untuk memverifikasi beberapa digit biner terkomputasi. Oleh karena itu jauh lebih cepat daripada perhitungan penuh.

Keuntungan dari ini adalah:

  1. Hanya satu perhitungan mahal yang dibutuhkan.

Kerugiannya adalah:

  1. Implementasi dari Diperlukan formula Bailey – Borwein-Plouffe (BBP).
  2. Langkah tambahan diperlukan untuk memverifikasi konversi radix dari biner ke desimal.

Saya telah membahas beberapa detail mengapa memverifikasi beberapa digit terakhir menyiratkan bahwa semua digit itu benar. Tetapi mudah untuk melihat ini karena kesalahan perhitungan akan merambat ke digit terakhir.


Sekarang langkah terakhir ini (memverifikasi konversi) sebenarnya cukup penting. Salah satu pemegang rekor dunia sebelumnya benar-benar memanggil kami karena ini, pada awalnya, saya tidak memberikan deskripsi yang cukup tentang cara kerjanya.

Jadi saya telah mengambil cuplikan ini dari blog saya:

N = # of decimal digits desired
p = 64-bit prime number

Masukkan deskripsi gambar di sini

Hitung A menggunakan basis 10 aritmatika dan B menggunakan aritmatika biner.

Masukkan deskripsi gambar di sini

Jika A = B, maka dengan "probabilitas sangat tinggi", konversi sudah benar.


Untuk bacaan lebih lanjut, lihat posting blog saya Pi - 5 Triliun Digit .


15
Dan untuk menjawab pertanyaan lain tentang bagaimana mengetahui kapan suatu algoritma tertentu telah terkonvergensi menjadi N digit: Ini mengharuskan Anda mengetahui perilaku konvergensi dari algoritma tersebut. Seri Taylor ArcTan(1)secara konvergen berkonvergensi. Jadi, Anda akan membutuhkan sejumlah besar istilah yang eksponensial untuk bertemu - singkatnya, jangan gunakan itu.
Mysticial

21
Ya, rumus Chudnovsky bertemu pada 14,18 digit stabil per term. Jadi, Anda dapat membagi jumlah total digit dengan itu untuk mendapatkan berapa banyak istilah yang Anda butuhkan. (Nilai Exact adalah: Log(151931373056000)/Log(10) = 14.181647462725477655...)
Mysticial

7
@ erikb85 Agak. Formula BBP (sampai batas tertentu) dianggap sebagai algoritma kedua. Tetapi dengan sendirinya itu tidak cukup karena tidak memverifikasi konversi ke basis 10. Gagasan menggunakan cek konversi BBP + untuk menghilangkan kebutuhan untuk perhitungan kedua bukan milikku. Ini pertama kali dilakukan oleh Fabrice Bellard dalam rekor dunia 2009-nya. Ide yang sangat bagus sehingga kami melakukan hal yang sama dan meningkatkannya.
Mysticial

83
@FunsukWangadu Saya hanya bisa berbicara untuk diri saya sendiri, tapi begini saja: Saya tidak pernah benar-benar peduli tentang Pi itu sendiri. Bagi saya, itu hanya nomor lain. Nilai tidak dalam jumlah itu sendiri atau 10 terabyte digit yang tidak berguna, itu adalah metode yang digunakan untuk mencapainya. Berabad-abad matematika, dan dekade penelitian komputer / pemrograman yang berkontribusi pada prestasi ini berlaku untuk banyak bidang lain dan karenanya JAUH lebih berharga daripada hard drive angka. Singkatnya: Menghitung angka Pi lebih merupakan olahraga.
Mysticial

8
@Mystical, baru saja menemukan situs perhitungan Pi Anda dari pertanyaan stackoverflow lain dan tidak bisa membantu tetapi melongo dan terkikik pada apa yang kalian lakukan. Mencintai kegagalan harddisk / gempa bumi di log :) murni luar biasa!
Joe

48

Tidak diragukan lagi, untuk keperluan Anda (yang saya asumsikan hanyalah latihan pemrograman), hal terbaik adalah memeriksa hasil Anda terhadap daftar digit pi di web.

Dan bagaimana kita tahu bahwa nilai-nilai itu benar? Yah, saya bisa mengatakan bahwa ada cara-ilmu komputer-y cara untuk membuktikan bahwa implementasi suatu algoritma adalah benar.

Lebih pragmatis, jika orang yang berbeda menggunakan algoritma yang berbeda, dan mereka semua setuju untuk (memilih angka) seribu (juta, apa pun) tempat desimal, yang akan memberi Anda perasaan hangat kabur bahwa mereka melakukannya dengan benar.

Secara historis, William Shanks menerbitkan pi ke 707 tempat desimal pada tahun 1873. Pria yang malang, dia membuat kesalahan mulai dari tempat desimal ke-528.

Sangat menarik, pada 1995 sebuah algoritma diterbitkan yang memiliki properti yang akan secara langsung menghitung digit ke-n (basis 16) pi tanpa harus menghitung semua digit sebelumnya !

Akhirnya, saya harap algoritma awal Anda bukan pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...Itu mungkin yang paling sederhana untuk diprogram, tetapi juga salah satu cara paling lambat untuk melakukannya. Lihatlah artikel pi di Wikipedia untuk pendekatan yang lebih cepat.


7
Formula terakhir itu (rumus Leibniz, iirc) sebenarnya bergantian dengan penambahan dan pengurangan.
Thomas

21

Anda bisa menggunakan banyak pendekatan dan melihat apakah mereka bertemu dengan jawaban yang sama. Atau ambil sebagian dari jaring. Algoritma Chudnovsky biasanya digunakan sebagai metode penghitungan pi yang sangat cepat. http://www.craig-wood.com/nick/articles/pi-chudnovsky/


Mengurangi peluang tetapi saya masih tidak yakin dengan solusi pendekatan berganda, bagaimana jika keduanya salah. Memeriksa net tidak memiliki validitas, lalu mengapa tidak mengambil nilai dari net itu sendiri. Saya sedang memikirkan bbp mana yang lebih cocok?
Ishan Sharma

7
@IshanSharma Jika kedua algoritme itu independen, maka kemungkinan kedua komputasi salah dengan hasil yang identik hampir nol. Jika ada yang salah dalam perhitungan mana pun, hasil akhirnya tidak akan cocok - sehingga Anda tahu setidaknya salah satunya salah.
Mysticial

15

Seri Taylor adalah salah satu cara untuk memperkirakan pi. Seperti dicatat itu konvergen perlahan.

Jumlah parsial dari seri Taylor dapat ditunjukkan berada dalam beberapa pengganda dari istilah berikutnya yang jauh dari nilai sebenarnya dari pi.

Cara lain mendekati pi memiliki cara yang sama untuk menghitung kesalahan maks.

Kami tahu ini karena kami bisa membuktikannya secara matematis.


Diperbantukan. Saya pikir sebagian besar jawaban di sini hanya tidak menempatkan cukup berat pada konsep bukti matematika . Apa pun program Anda untuk menghitung digit pi, tidak akan pernah lebih meyakinkan daripada bukti matematika paling meyakinkan bahwa metode program Anda memang menghitung pi. Yang menunjukkan kendala berbeda pada program yang menghitung pi pi: bahwa mereka harus bertujuan sebanyak untuk dimengerti sebagai kinerja dan kebenaran.
Luis Casillas

5

Anda dapat mencoba komputasi sin(pi/2)(atau cos(pi/2)dalam hal ini) menggunakan seri daya (cukup) konvergen cepat untuk dosa dan cos. (Bahkan lebih baik: gunakan berbagai rumus penggandaan untuk menghitung lebih dekat x=0untuk konvergensi yang lebih cepat.)

BTW, lebih baik daripada menggunakan seri untuk tan(x)is, dengan komputasi katakanlah cos(x)sebagai kotak hitam (misalnya Anda bisa menggunakan seri taylor seperti di atas) adalah melakukan pencarian root melalui Newton. Tentu saja ada algoritma yang lebih baik di luar sana, tetapi jika Anda tidak ingin memverifikasi berton-ton ini sudah cukup (dan itu tidak terlalu sulit untuk diterapkan, dan Anda hanya perlu sedikit kalkulus untuk memahami mengapa ia bekerja.)


6
Saya tidak begitu mengerti bagaimana ini akan membantu menemukan bahwa angka ke-1000 dimatikan oleh 1. Anda akan membutuhkan nilai yang sangat tepat sin(pi/2)bukan?
Matthieu M.

Saya tidak yakin harus berkata apa tentang jawaban sebelumnya, kecuali itu adalah lelucon atau sesuatu. sin (pi / 2) = 1 cos (pi / 2) = 0 Jadi, saya katakan yang pasti konvergen dengan cepat.
BentFranklin

15
Saya kira itu tidak jelas bagi semua orang bahwa mengevaluasi sin(x)dan cos(x)presisi tinggi sebenarnya jauh lebih sulit daripada menghitung Pi sendiri.
Mysticial

2
Untuk alasan yang jelas, Anda tidak boleh menggunakan dosa (pi / 2) untuk ini. Lebih baik menggunakan dosa (pi / 6) dan pastikan itu keluar tepat 1/2.
Robert Lozyniak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.