Я пытаюсь реализовать следующую функцию с плавающей запятой двойной точности с низкой относительной ошибкой:
Это широко используется в статистических приложениях для добавления вероятностей или плотностей вероятностей, представленных в лог-пространстве. Конечно, или могут легко переполниться или опуститься, что было бы плохо, потому что пространство журнала используется во-первых, чтобы избежать потери. Это типичное решение:
Отмена от действительно происходит, но смягчается . Хуже всего, когда и близки. Вот график относительной ошибки:
График обрезан в чтобы подчеркнуть форму кривой , относительно которой происходит отмена. Я видел ошибку до и подозреваю, что она становится намного хуже. (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
Кажется, мне нужен новый подход. Что бы это могло быть?
источник
Ответы:
Формула должна быть численно устойчивой. Она обобщает численно устойчивое вычисление log ∑ i e x i = ξ + log ∑ i e x i -
Если логарифм очень близок к нулю и вам нужна высокая относительная точность, вы, вероятно, можете использовать используя точная (т. е. с более чем двойной точностью) реализация l e x p ( z ) : = log ( 1 + e - | z | )
источник