log (1 + x) для log1p как log (1-x) для? - PullRequest
8 голосов
/ 28 марта 2012

<math.h> обеспечивает более точный метод для вычисления log(1+x) для double с.

Существует ли такой же точный способ для вычисления log(1-x)?

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь выполнить некоторую работу в пространстве журнала для большей точности (в основном я умножаю и суммирую числа, очень близкие к нулю).Мне было легко написать функцию, которая выдает log( exp(log_of_a) + exp(log_of_b) ) = log( a + b ) с помощью log1p.Я пытаюсь сделать подобную функцию для разницы:

log( exp(log_of_a) - exp(log_of_b) ) = log( a - b ) , где a > b, конечно.

По существу, до тех пор, пока ни log_aили log_b == -inf, функция должна просто возвращать:

return log( 1 - exp(log_b-log_a) ) + log_a;

В моей функции log_add я получаю log( 1 + ... ), поэтому я использую log1p.Но здесь у меня есть log( 1 - ... ).На всякий случай я даже прогуглил log1m, но не повезло ...

Когда аргумент x находится в диапазоне [-inf, 1), тогда я мог бы просто использовать log1p(-x) (учитывая мое утверждение a > b).

Это лучший способ решить эту проблему?Я чувствую, что должен выполнять работу, которая была выполнена раньше ...

Я был бы очень признателен за вашу помощь, зная, как получить наиболее точные результаты, которые я могу (или объясняя, почему я не могу получить результаты более точныечем это).

1 Ответ

13 голосов
/ 28 марта 2012

@ Раймонд Чен: «Отрицание чисел с плавающей запятой является точным, поэтому log1p(-x) точно так же, как log1p(x)». Просто превращаю это в реальный ответ.

...