Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

log1p

#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&);

}} // namespaces

返回x+1的自然對數。

函數返回值的類型使用返回值推導法則:來確定,當x是整型的時候,返回值的類型是double,否則返回值是類型是T.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

有許多計算log(x+1)的情況是可取的, 然而,對於較小的x值 那麼x+1 將會 受到巨量消失誤差(catastrophic cancellation errors)以至於x+1 == 1log(x+1) == 0, 而事實上對於較小的 x, 對於log(x+1) 最佳逼近值是 x. log1p 函數出於精度的考慮使用泰勒級數展開來計算log(1+x)最佳逼近值 (小於2個epsilon). 另一方面,請注意:存在更快的計算方法, 使用下面的等價關係:

log(1+x) == (log(1+x) * x) / ((1-x) - 1)

然而, 經驗顯示,當打開編譯器的優化選項的時候,這些函數將會導致很明顯的失敗,因此只會在一個已知的編譯器中上面的方法不會失效時才會使用這個方法. 相反, 級數展開的方法對於編譯器優化導致的錯誤似乎具有免疫.

最後,當定義了 BOOST_HAS_EXPM1 時,float/double/long double 這些模板的特化只是簡單的調用這些平台(POSIX)定義的函數。

下面的圖像顯示了 log1p 的特性:

精確度

對於內建的浮點類型,expm1 具有近似於 1 epsilon(10的-5次方) 的精確度.

測試

混合的抽樣測試, 隨機的高精度的測試數據使用1000-bits精度的 NTL::RR 庫產生的數據。


PrevUpHomeNext