⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powers.qbk

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 QBK
字号:
[section:powers Logs, Powers, Roots and Exponentials][section:log1p log1p]``#include <boost/math/special_functions/log1p.hpp>``   namespace boost{ namespace math{      template <class T>   ``__sf_result`` log1p(T x);      template <class T, class ``__Policy``>   ``__sf_result`` log1p(T x, const ``__Policy``&);      }} // namespaces   Returns the natural logarithm of `x+1`.The return type of this function is computed using the __arg_pomotion_rules:the return is `double` when /x/ is an integer type and T otherwise.[optional_policy]There are many situations where it is desirable to compute `log(x+1)`. However, for small `x` then `x+1` suffers from catastrophic cancellation errors so that `x+1 == 1` and `log(x+1) == 0`, when in fact for very small x, the best approximation to `log(x+1)` would be `x`.  `log1p` calculates the bestapproximation to `log(1+x)` using a Taylor series expansion for accuracy (less than __te).Alternatively note that there are faster methods available, for example using the equivalence:   log(1+x) == (log(1+x) * x) / ((1-x) - 1)However, experience has shown that these methods tend to fail quite spectacularlyonce the compiler's optimizations are turned on, consequently they areused only when known not to break with a particular compiler.  In contrast, the series expansion method seems to be reasonably immune to optimizer-induced errors.Finally when BOOST_HAS_LOG1P is defined then the `float/double/long double` specializations of this template simply forward to the platform's native (POSIX) implementation of this function.The following graph illustrates the behaviour of log1p:[graph log1p][h4 Accuracy]For built in floating point types `log1p`should have approximately 1 epsilon accuracy.[h4 Testing]A mixture of spot test sanity checks, and random high precision test valuescalculated using NTL::RR at 1000-bit precision.[endsect][section:expm1 expm1]``#include <boost/math/special_functions/expm1.hpp>``   namespace boost{ namespace math{      template <class T>   ``__sf_result`` expm1(T x);      template <class T, class ``__Policy``>   ``__sf_result`` expm1(T x, const ``__Policy``&);      }} // namespaces   Returns e[super x] - 1.The return type of this function is computed using the __arg_pomotion_rules:the return is `double` when /x/ is an integer type and T otherwise.[optional_policy]For small x, then __ex is very close to 1, as a result calculating __exm1 resultsin catastrophic cancellation errors when x is small.  `expm1` calculates __exm1 usingrational approximations (for up to 128-bit long doubles), otherwise viaa series expansion when x is small (giving an accuracy of less than __te).Finally when BOOST_HAS_EXPM1 is defined then the `float/double/long double` specializations of this template simply forward to the platform's native (POSIX) implementation of this function.The following graph illustrates the behaviour of expm1:[graph expm1]   [h4 Accuracy]For built in floating point types `expm1`should have approximately 1 epsilon accuracy.[h4 Testing]A mixture of spot test sanity checks, and random high precision test valuescalculated using NTL::RR at 1000-bit precision.[endsect][section:cbrt cbrt]``#include <boost/math/special_functions/cbrt.hpp>``   namespace boost{ namespace math{      template <class T>   ``__sf_result`` cbrt(T x);      template <class T, class ``__Policy``>   ``__sf_result`` cbrt(T x, const ``__Policy``&);      }} // namespaces   Returns the cubed root of x: x[super 1/3].The return type of this function is computed using the __arg_pomotion_rules:the return is `double` when /x/ is an integer type and T otherwise.[optional_policy]Implemented using Halley iteration.The following graph illustrates the behaviour of cbrt:[graph cbrt]   [h4 Accuracy]For built in floating-point types `cbrt`should have approximately 2 epsilon accuracy.[h4 Testing]A mixture of spot test sanity checks, and random high precision test valuescalculated using NTL::RR at 1000-bit precision.[endsect][section:sqrt1pm1 sqrt1pm1]``#include <boost/math/special_functions/sqrt1pm1.hpp>``   namespace boost{ namespace math{      template <class T>   ``__sf_result`` sqrt1pm1(T x);      template <class T, class ``__Policy``>   ``__sf_result`` sqrt1pm1(T x, const ``__Policy``&);      }} // namespaces   Returns `sqrt(1+x) - 1`.The return type of this function is computed using the __arg_pomotion_rules:the return is `double` when /x/ is an integer type and T otherwise.[optional_policy]This function is useful when you need the difference between sqrt(x) and 1, whenx is itself close to 1.Implemented in terms of `log1p` and `expm1`.The following graph illustrates the behaviour of sqrt1pm1:[graph sqrt1pm1][h4 Accuracy]For built in floating-point types `sqrt1pm1`should have approximately 3 epsilon accuracy.[h4 Testing]A selection of random high precision test valuescalculated using NTL::RR at 1000-bit precision.[endsect][section:powm1 powm1]``#include <boost/math/special_functions/powm1.hpp>``   namespace boost{ namespace math{      template <class T1, class T2>   ``__sf_result`` powm1(T1 x, T2 y);      template <class T1, class T2, class ``__Policy``>   ``__sf_result`` powm1(T1 x, T2 y, const ``__Policy``&);      }} // namespaces   Returns x[super y ] - 1.The return type of this function is computed using the __arg_pomotion_ruleswhen T1 and T2 are dufferent types.[optional_policy]There are two domains where this is useful: when y is very small, or whenx is close to 1.Implemented in terms of `expm1`.The following graph illustrates the behaviour of powm1:[graph powm1][h4 Accuracy]Should have approximately 2-3 epsilon accuracy.[h4 Testing]A selection of random high precision test valuescalculated using NTL::RR at 1000-bit precision.[endsect][section:hypot hypot]   template <class T1, class T2>   ``__sf_result`` hypot(T1 x, T2 y);      template <class T1, class T2, class ``__Policy``>   ``__sf_result`` hypot(T1 x, T2 y, const ``__Policy``&);   __effects computes [equation hypot]in such a way as to avoid undue underflow and overflow.The return type of this function is computed using the __arg_pomotion_ruleswhen T1 and T2 are of different types.[optional_policy]When calculating [equation hypot] it's quite easy for the intermediate terms to eitheroverflow or underflow, even though the result is in fact perfectly representable.[h4 Implementation]The function is even and symmetric in x and y, so first take assume['x,y > 0] and ['x > y] (we can permute the arguments if this is not the case).Then if ['x * [epsilon][space] >= y] we can simply return /x/.Otherwise the result is given by:[equation hypot2][endsect][include pow.qbk][endsect][/section:powers Logs, Powers, Roots and Exponentials][/   Copyright 2006 John Maddock and Paul A. Bristow.  Distributed under the Boost Software License, Version 1.0.  (See accompanying file LICENSE_1_0.txt or copy at  http://www.boost.org/LICENSE_1_0.txt).]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -