0.1 + 0.20.30000000000000004
Setelah menyelesaikan unit ini, pembaca dapat:
Prasyarat lokal: operasi bilangan rasional, fungsi, persamaan sederhana, dan penalaran “untuk setiap” versus “ada”. Tidak diperlukan kalkulus atau aljabar linear.
Pertimbangkan bilangan rasional
Ada tiga lapisan berbeda:
Kesalahan umum adalah menganggap keluaran sebagai objek itu sendiri. Program yang mencetak 0.30000000000000004 tidak membantah kesamaan rasional tadi. Ia menunjukkan sifat representasi titik-mengambang yang dipakai program.
Python menyediakan bilangan titik-mengambang untuk perhitungan numerik dan Fraction untuk bilangan rasional eksak.
0.1 + 0.20.30000000000000004
from fractions import Fraction
Fraction(1, 10) + Fraction(2, 10)Fraction(3, 10)
Representasi yang berbeda menjawab kebutuhan berbeda. Aritmetika eksak mempertahankan kesamaan aljabar, tetapi ukuran pembilang dan penyebut dapat bertambah. Titik-mengambang cepat dan menjadi dasar banyak pustaka numerik, tetapi membawa galat pembulatan.
Karena itu, perbandingan numerik harus menyatakan toleransi dan skala:
from math import isclose
x = 0.1 + 0.2
isclose(x, 0.3, rel_tol=1e-12, abs_tol=1e-15)True
Toleransi bukan mantra. Toleransi adalah bagian dari spesifikasi eksperimen. Kita harus dapat menjelaskan mengapa besarannya memadai bagi pertanyaan yang diajukan.
Eksperimen komputasional minimal memuat tujuh unsur berikut.
| Unsur | Pertanyaan yang harus dijawab |
|---|---|
| Pertanyaan | Klaim atau gejala apa yang sedang diselidiki? |
| Lingkungan | Versi bahasa dan perangkat lunak apa yang dipakai? |
| Masukan | Data, parameter, dan satuannya apa? |
| Metode | Algoritme dan representasi apa yang dipakai? |
| Pemeriksaan | Tes apa yang dapat mendeteksi kesalahan implementasi? |
| Keluaran | Data mentah dan ringkasan apa yang disimpan? |
| Kesimpulan | Apa yang didukung hasil, dan apa yang belum dibuktikan? |
Jalankan eksperimen Unit 1 dari akar proyek:
python source/code/unit01_experiment.py
Berkas JSON yang dihasilkan mencatat versi Python, parameter, hasil eksak, hasil titik-mengambang, dan pemeriksaan dua dugaan. Menjalankan perintah yang sama pada lingkungan yang sama harus menghasilkan byte yang sama.
Eksperimen dapat memeriksa bahwa
genap untuk seribu bilangan bulat pertama. Pemeriksaan itu merupakan bukti kerja yang berguna: ia dapat menemukan kekeliruan kode atau contoh penyangkal. Namun, seribu kasus tidak membuktikan klaim untuk semua bilangan bulat.
Bukti umum singkatnya adalah
Dua bilangan bulat berurutan selalu memuat satu bilangan genap, sehingga hasil kalinya genap. Argumen ini berlaku untuk setiap bilangan bulat, bukan hanya masukan yang sempat dijalankan.
Sebaliknya, satu contoh penyangkal memang cukup untuk meruntuhkan klaim universal. Polinom
menghasilkan bilangan prima bagi banyak nilai kecil, tetapi p(40)=41^2. Komputer dapat menemukan contoh ini; faktorisasi tersebut menjelaskan secara matematis mengapa klaim “prima untuk setiap bilangan bulat taknegatif” salah.
Tes program adalah klaim terbatas dan dapat diperiksa, misalnya:
3/10;0.3 pada toleransi yang ditetapkan;n=40; danTes meningkatkan kepercayaan terhadap implementasi. Tes tidak dengan sendirinya membuktikan teorema yang sedang diimplementasikan.
Jelaskan dengan kata-kata sendiri mengapa keluaran 0.30000000000000004 tidak membuat persamaan menjadi salah.
Pisahkan objek matematika dari cara komputer menyimpannya.
Kesamaan itu adalah kesamaan eksak dalam bilangan rasional. Bilangan 0.1 dan 0.2 tidak tersimpan secara eksak dalam representasi biner titik-mengambang yang dipakai Python. Galat kecil pada keluaran berasal dari pendekatan representasi, bukan dari perubahan aturan penjumlahan rasional.
Tuliskan satu situasi yang wajar memakai abs_tol dan satu situasi yang lebih wajar memakai rel_tol. Nyatakan alasan, bukan hanya angkanya.
Bandingkan besaran yang dekat nol dengan besaran yang mempunyai skala alami besar.
Untuk residual persamaan yang secara teori nol, toleransi absolut sesuai karena galat dibandingkan langsung dengan nol. Untuk membandingkan dua jarak sekitar satu juta meter, toleransi relatif lebih informatif karena galat yang dapat diterima mengikuti skala jarak. Dalam pekerjaan nyata, keduanya sering dipakai bersama dan harus diturunkan dari kebutuhan masalah.
Ubah batas pemeriksaan paritas dari 1.000 menjadi 100.000. Kesimpulan baru apa yang sah, dan kesimpulan apa yang tetap tidak sah?
Lebih banyak kasus memperbesar wilayah yang telah diperiksa, bukan mengubahnya menjadi himpunan semua bilangan bulat.
Sah: tidak ada contoh penyangkal yang ditemukan dalam rentang 0 sampai 99.999, dengan asumsi pemeriksa diimplementasikan benar. Tidak sah: klaim telah dibuktikan untuk semua bilangan bulat. Bukti umum masih memerlukan argumen seperti faktorisasi n(n+1).
Gunakan program untuk mencari nilai bulat taknegatif terkecil yang membuat komposit. Lalu jelaskan hasilnya tanpa bergantung pada program.
Periksa nilai 40 dan faktorkan hasilnya.
Nilai terkecilnya adalah n=40. Secara eksak, , sehingga nilainya komposit. Perhitungan eksak ini menjadi penjelasan matematis yang dapat diperiksa terpisah dari program.
Baca output/unit01-results.json. Sebutkan dua medan yang diperlukan untuk menjalankan ulang eksperimen dan satu informasi yang masih perlu ditambahkan jika eksperimen memakai pustaka eksternal.
Perhatikan parameter dan lingkungan.
Contoh jawaban: limit dan versi Python diperlukan. Jika eksperimen memakai pustaka eksternal, rekaman juga perlu menyimpan nama dan versi pustaka tersebut, serta idealnya berkas lingkungan atau kunci dependensi yang dapat dipasang ulang.