Чи є вдосконалені способи обчислення


11

Більшість математичних бібліотек мають ряд версій функцій логарифму. Більшу частину часу ми вважаємо їх ідеальними, але насправді їх досить багато просто пропонують певну кількість цифр точності.

Для деяких функцій існують чисельніші стабільні варіанти. Наприклад, у 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 безкоштовно (хоча одне множення з постійною, очевидно, не є вбивчою дорогою). Дякую.


1
м10-308pМ10-308|журналp|700pжурналpp=0

R поставляється з log2функцією, яка залежно від вашої ОС може бути простою обгорткою навколо log/log(2)або використовувати той факт, що C99 додав log2функцію.
анонімний

Відповіді:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.