Apakah ada peningkatan cara menghitung

11

Sebagian besar perpustakaan matematika memiliki sejumlah versi fungsi logaritma. Sebagian besar waktu kita menganggap mereka sempurna, tetapi sebenarnya cukup banyak dari mereka hanya menawarkan sejumlah digit presisi.

Untuk beberapa fungsi, ada varian yang lebih stabil secara numerik. Misalnya Fortran, R, Java, dan C keduanya Math.log1p, untuk komputasi log(1.0+x)(yang menawarkan presisi lebih tinggi untuk nilai kecil x), dan pasangannya expm1. Di sini masalah numerik muncul dari kehilangan presisi - jika xbenar-benar kecil, 1.0 + xkehilangan digit untuk mempertahankan 1 di awal.

Saya telah melihat fungsi seperti itu untuk meningkatkan presisi dalam sejumlah situasi. Ini tampaknya cukup umum setiap kali Anda menerapkan fungsi distribusi (Gamma, Beta, Poisson dll.) Dengan ketepatan angka yang tinggi. Misalnya fungsi Gamma tampaknya paling sering digunakan sebagai logGamma. Secara umum, pergi ke "logspace" dapat meningkatkan presisi banyak, dan R tampaknya memiliki bendera "logspace" pada sebagian besar fungsi.

Contoh lain, di R, ada log1mexpuntuk log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

Saya telah bermain-main dengan entropi dan langkah-langkah teori informasi. Istilah yang sangat umum ada

p * -log(p)

di mana biasanya, orang ingin basis logaritma menjadi 2, bukan e; tetapi sama seringnya ini hanya faktor linier, dan Anda juga dapat menggunakan logaritma natural (jadi ini bukan kunci penting bagi saya). Lagi pula, apakah Anda tahu jika ada cara komputasi yang lebih cepat / lebih langsung / lebih tepat? Saya memilikinya di mana-mana, jadi itu benar-benar dapat membayar untuk membuatnya sedikit lebih tepat dan cepat (menyelamatkan saya hal-hal "optimasi prematur" yang biasa, terima kasih).

Saya tidak melihat alasan yang jelas yang akan menyebabkan hilangnya presisi. Jadi saya sangat tertarik jika ada trik yang bagus untuk mempercepat perhitungan ini. Itu mungkin bahkan menyelamatkan saya mengobati kasing p=0sudut (yang masuk akal 0, meskipun log(0)tidak ada) atau memberi saya basis 2 gratis (meskipun perkalian tunggal dengan konstanta jelas bukan pembunuh mahal). Terima kasih.

Memiliki QUIT - Anony-Mousse
sumber
1
m10308pM10308|logp|700plogpp=0
R hadir dengan log2fungsi yang tergantung pada OS Anda dapat menjadi pembungkus sederhana log/log(2)atau memanfaatkan fakta bahwa C99 menambahkan log2fungsi.
anonim

Jawaban:

11

plogp[0,1]0

p ? p * -log(p) : 0
Geoffrey Irving
sumber