Ketepatan tersirat dari fungsi floating-point

9

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:

  1. 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?
  2. Apakah itu benar untuk Python math.erf()atau SciPy scipy.stats.norm.cdf()khususnya? Bagaimana kamu bisa tahu?
  3. Halaman manualsin() 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" yang Math.sin()hanya akan akurat dalam keadaan tertentu dalam JavaScript, seperti di tempat lain?

200_sukses
sumber
1
FYI mengenai pertanyaan 1: Biasanya jaminan presisi diberikan dalam hal ULP (unit di tempat terakhir) yang mengacu pada digit biner float.

Jawaban:

10

Jika dokumentasi tidak menyebutkan secara khusus, apakah ini menyiratkan bahwa jenis-jenis fungsi ini sepenuhnya akurat ke tempat desimal terakhir, dalam ketelitian yang ditawarkan oleh IEEE floating-point presisi ganda?

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.

Tampaknya ada beban yang dibebankan pada penelepon untuk mengkanoniskan input untuk mendapatkan akurasi yang optimal.

Itu penilaian yang adil. Apa yang membuatnya diterima adalah bahwa dokumentasi menyatakan itu, sehingga tidak ada kejutan.

Di sisi lain, dokumentasi Mozilla ...

Saya menyarankan Anda mencoba beberapa perhitungan di setiap perpustakaan atau bahasa pemrograman (terutama di dekat area batas seperti di sin()dekat kelipatan pi), dan membandingkannya. Ini akan memberi Anda gagasan yang adil tentang perilaku seperti apa yang dapat Anda harapkan dari masing-masing perilaku tersebut.

Robert Harvey
sumber
2
Tes adalah ide yang bagus. Ada banyak waktu di mana dokumentasi mengatakan satu hal, namun fungsinya berperilaku dengan cara lain. Dan OP ingin mengandalkan asumsi implisit yang bahkan tidak didokumentasikan.
Siyuan Ren