Ketika meninjau implementasi programmer lain dari fungsi untuk menghitung distribusi CDF normal , saya membuat saran untuk mengganti seluruh implementasi dengan fungsi bawaan Python atau menggunakan SciPy, perpustakaan ilmiah umum.
Programmer lain menunjukkan bahwa keduanya math.erfc()
tidak scipy.stats.norm.cdf()
memberikan jaminan presisi dalam dokumentasi mereka. Oleh karena itu, saya harus lebih berhati-hati dalam mengganti algoritma aproksimasi (yang diambil dari sumber yang disegani , dan yang telah mendokumentasikan batas kesalahan ).
Sejujurnya, pikiran untuk meragukan keakuratan dan ketepatan fungsi built-in atau perpustakaan tidak pernah terlintas dalam pikiran saya. Bagaimanapun, saya telah memanggil fungsi seperti sin()
dan sqrt()
selama bertahun-tahun tanpa banyak berpikir - mengapa harus math.erf()
atau scipy.stats.norm.cdf()
berbeda?
Tapi sekarang, saya khawatir. Pertanyaan saya adalah:
- Secara umum, jika dokumentasi tidak menyebutkan secara khusus, apakah ini menyiratkan bahwa jenis-jenis fungsi ini benar-benar akurat ke tempat desimal terakhir, dalam ketelitian yang ditawarkan oleh IEEE floating-point presisi ganda?
- Apakah itu benar untuk Python
math.erf()
atau SciPyscipy.stats.norm.cdf()
khususnya? Bagaimana kamu bisa tahu? Halaman manual
sin()
ini untuk mengatakan ...Fungsi-fungsi ini mungkin kehilangan keakuratan ketika argumen mereka dekat beberapa pi atau jauh dari 0,0.
Mengapa peringatan seperti itu ada, ketika fungsi sinus periodik dan simetris? Tampaknya ada beban yang dibebankan pada penelepon untuk mengkanoniskan input untuk mendapatkan akurasi yang optimal.
Di sisi lain, dokumentasi Mozilla untuk
Math.sin()
mengatakan apa-apa tentang akurasi atau ketepatan. Apakah itu berarti bahwa itu sepenuhnya akurat, atau itu "pengetahuan umum" yangMath.sin()
hanya akan akurat dalam keadaan tertentu dalam JavaScript, seperti di tempat lain?
sumber
Jawaban:
Saya tidak akan membuat asumsi itu.
Di mana saya bekerja, kita berurusan dengan data telemetri, dan sudah menjadi rahasia umum bahwa dua perpustakaan matematika yang berbeda dapat menghasilkan dua hasil yang berbeda, bahkan jika keduanya sesuai dengan standar titik apung IEEE. Ini memiliki implikasi ketika Anda mencoba mengulangi perhitungan dan membandingkan dua hasil untuk kesetaraan.
Itu penilaian yang adil. Apa yang membuatnya diterima adalah bahwa dokumentasi menyatakan itu, sehingga tidak ada kejutan.
Saya menyarankan Anda mencoba beberapa perhitungan di setiap perpustakaan atau bahasa pemrograman (terutama di dekat area batas seperti di
sin()
dekat kelipatanpi
), dan membandingkannya. Ini akan memberi Anda gagasan yang adil tentang perilaku seperti apa yang dapat Anda harapkan dari masing-masing perilaku tersebut.sumber