Більшість математичних бібліотек мають ряд версій функцій логарифму. Більшу частину часу ми вважаємо їх ідеальними, але насправді їх досить багато просто пропонують певну кількість цифр точності.
Для деяких функцій існують чисельніші стабільні варіанти. Наприклад, у Fortran, R, Java і C є Math.log1p
обчислення log(1.0+x)
(що забезпечує більш високу точність для малих значень x) та аналог expm1
. Тут числові проблеми виникають через втрату точності - якщо x
вона дійсно мала, 1.0 + x
втрачає цифри, щоб зберегти 1 на початку.
Я бачив такі функції для більшої точності в ряді ситуацій. Це, мабуть, досить часто, коли ви реалізуєте функції розподілу (Gamma, Beta, Poisson тощо) з високою числовою точністю. Наприклад, функція Gamma, здається, більшість часу використовується як logGamma
. Взагалі, перехід до "журнального простору" може значно покращити точність, і тому R, здається, має прапор "журнального простору" на більшості функцій.
Інший приклад, в R, існує log1mexp
для log(1 - exp(p))
:
http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
Я займався ентропією та теоретичними заходами інформації. Дуже поширений термін існує
p * -log(p)
де зазвичай хочеться, щоб основа логарифму була 2, а не e; але так само часто це лише лінійний фактор, і ви також можете використовувати природний логарифм (тому для мене це не має ключового значення). У будь-якому випадку, чи знаєте ви, чи існує швидший / прямий / точніший спосіб обчислення цього терміна? У мене це є в усьому світі, тож це дійсно може окупитися, щоб зробити його трохи більш точним і швидким (врятуйте мене звичайні речі "передчасної оптимізації", дякую).
Я не бачу жодної очевидної причини, яка могла б призвести до втрати точності. Тому мене найбільше цікавить, чи є якийсь приємний трюк для прискорення цього обчислення. Це, можливо, навіть рятує мене, коли я розглядаю p=0
кутовий випадок (що розумно є 0
, хоча log(0)
не існує) або дає мені базу 2 безкоштовно (хоча одне множення з постійною, очевидно, не є вбивчою дорогою). Дякую.
log2
функцією, яка залежно від вашої ОС може бути простою обгорткою навколо log/log(2)
або використовувати той факт, що C99 додав log2
функцію.