Я намагаюся реалізувати наступну функцію у плаваючої точки з подвійною точністю з низькою відносною помилкою:
Це широко використовується в статистичних додатках для додавання ймовірностей або щільності ймовірностей, які представлені в журнальному просторі. Звичайно, або або \ exp (y) можуть легко переповнюватись або перетікати, що було б погано, оскільки використовується журнальний простір, щоб уникнути переливу в першу чергу. Це типове рішення:exp ( y )
Скасування з трапляється, але пом'якшується . Набагато гірше - це коли і близькі. Ось відносний графік помилок:
Ділянка відрізається на щоб підкреслити форму кривої , щодо якої відбувається скасування. Я бачив помилку до і підозрюю, що вона стає набагато гіршою. (FWIW, функція "основна правда" реалізована за допомогою плавців довільної точності MPFR з 128-бітовою точністю.) l o g s u m ( x , y ) = 0 10 - 11
Я спробував інші переформулювання, все з тим самим результатом. Якщо як зовнішній вираз, однакова помилка виникає, приймаючи журнал чогось поблизу 1. З як зовнішнім виразом, у внутрішньому виразі відбувається скасування.l o g 1 p
Тепер абсолютна помилка дуже мала, тому має дуже малу відносну похибку (в межах епсилона). Можна стверджувати, що оскільки користувач дійсно зацікавлений у ймовірностях (а не ймовірностях журналу), ця жахлива відносна помилка не є проблемою. Можливо, зазвичай це не так, але я пишу функцію бібліотеки, і я хотів би, щоб її клієнти могли розраховувати на відносну помилку не набагато гіршу, ніж помилка округлення.l o g s u m
Здається, мені потрібен новий підхід. Що це може бути?