hesaplamasının geliştirilmiş yolları var mı?


11

Çoğu matematik kütüphanesinde logaritma fonksiyonlarının bazı versiyonları vardır. Çoğu zaman onların mükemmel olduklarını varsayıyoruz, ancak aslında birçoğu sadece belirli sayıda hassas basamak sunuyor.

Bazı işlevler için sayısal olarak daha kararlı varyantlar vardır. Örneğin, Fortran, R, Java ve C'nin her ikisi de Math.log1phesaplama için log(1.0+x)(küçük x değerleri için daha yüksek hassasiyet sunar) ve muadili expm1. Burada sayısal problemler hassasiyette bir kayıptan kaynaklanır - eğer xgerçekten küçükse, 1.0 + xbaşlangıçta 1'i korumak için rakamları kaybeder.

Bazı durumlarda artan hassasiyet için bu tür fonksiyonları gördüm. Bu, yüksek sayısal hassasiyetle dağıtım işlevlerini (Gamma, Beta, Poisson vb.) Uyguladığınızda oldukça yaygın görünmektedir. Örneğin Gamma fonksiyonu çoğu zaman olarak kullanılır logGamma. Genel olarak, "günlük alanına" gitmek hassasiyeti çok artırabilir ve bu nedenle R çoğu fonksiyonda bir "günlük alanı" bayrağına sahip gibi görünür.

Başka bir örnek, R, vardır log1mexpiçin log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

Entropi ve enformasyon teorik önlemleri ile oynuyorum. Çok yaygın bir terim var

p * -log(p)

genellikle logaritmanın tabanının e değil 2 olmasını ister; ancak çoğu zaman bu sadece doğrusal bir faktördür ve doğal logaritmayı da kullanabilirsiniz (bu yüzden bu benim için önemli değil). Her neyse, bu terimi hesaplamanın daha hızlı / daha doğrudan / daha kesin bir yolu olup olmadığını biliyor musunuz? Ben her yerde yapıyorum, bu yüzden gerçekten biraz daha hassas ve hızlı yapmak için ödeyebilir (beni kurtarmak her zamanki "erken optimizasyon" şeyler, teşekkürler).

Hassasiyet kaybına neden olacak açık bir neden görmüyorum. Bu yüzden çoğunlukla bu hesaplamayı hızlandırmak için güzel bir hile olup olmadığını merak ediyorum. Bu belki de p=0köşe kasasını tedavi etmekten kurtarıyor (ki bu mantıklı bir şekilde var 0olmamasına rağmen log(0)) ya da ücretsiz olarak bana taban 2 veriyor (bir sabit ile tek bir çarpma açıkça katil pahalı olmasa da). Teşekkürler.


1
m10308pM10308|logp|700plogpp=0

R log2, işletim sisteminize bağlı olarak basit bir sarıcı olabilen log/log(2)veya C99'un bir log2işlev eklediği gerçeğinden yararlanabilecek bir işlevle birlikte gelir.
anonim

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.