#include <boost/math/special_functions/log1p.hpp>
namespace boost{ namespace math{
template <class T>
calculated-result-type log1p(T x);
template <class T, class Policy>
calculated-result-type log1p(T x, const Policy&);
}}
Возвращает естественный логарифм<x+1
>.
Тип возврата этой функции вычисляется с использованием правил расчета типа результата.: Возвращение<double
>, когдаxявляется целым типом, а T иначе.
Окончательный аргументПолитикаявляется необязательным и может быть использован для контроля поведения функции: как она обрабатывает ошибки, какой уровень точности использовать и т. д. См. документациюдля более подробной информации.
Есть много ситуаций, когда желательно вычислить<log(x+1)
>. Однако для малых<x
>тогда<x+1
>страдает от катастрофических ошибок отмены, так что<x+1==1
>и<log(x+1)==0
>, когда на самом деле для очень маленьких x наилучшим приближением к<log(x+1)
>будет<x
>.<log1p
>вычисляет наилучшее приближение к<log(1+x)
>с использованием расширения серии Тейлора для точности (менее 2ɛ). В качестве альтернативы отметим, что существуют более быстрые методы, например, с использованием эквивалентности:
log(1+x) == (log(1+x) * x) / ((1+x) - 1)
Тем не менее, опыт показал, что эти методы, как правило, довольно эффектно выходят из строя после включения оптимизаций компилятора, поэтому они используются только тогда, когда известно, что они не порвутся с конкретным компилятором. Напротив, метод расширения серии, по-видимому, достаточно неуязвим для ошибок, вызванных оптимизатором.
Наконец, когда BOOST_HAS_LOG1P определена, тогда<float/double/longdouble
>специализации этого шаблона просто перенаправляются на нативную (POSIX) реализацию этой функции.
Следующий график иллюстрирует поведение log1p:

Для встроенных в плавающие точки типов<log1p
>должно быть приблизительно 1 эпсилон точности.
Table 6.78. Error rates for log1p
|
Microsoft Visual C++ версия 12.0 Win32 двойная
|
GNU C++ версия 5.1.0 Linux Double
|
GNU C++ версия 5.1.0 Linux длинный двойной
|
Солнечный компилятор версии 0x5130 Солнечный солярис
|
Случайные тестовые данные |
Max = 0,509ε (Mean = 0,057ε)
:Max = 0,509ε (Mean = 0,057ε)] |
Макс = 0.846ε (Средний = 0,153ε)
Rmath 3.0.2:Макс = 0.846ε (Средний = 0,153ε)] Цефес:Макс = 0.799ε (Средний = 0,122ε)] |
Max = 0.818ε (Mean = 0.227ε)
:Max = 0.818ε (Mean = 0.227ε)] :Max = 0.818ε (Mean = 0.227ε)] |
Макс = 1.53ε (Средний = 0.627ε)
:Макс = 0.818ε (Средний = 0.249ε)] |
Смесь проверок здравомыслия спот-тестов и случайных значений высокоточных испытаний, рассчитанных с использованием NTL::RR с точностью 1000 бит.