Boost C++ 库

……是世界上最受尊敬、设计最精巧的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu《C++ 编码规范》

指数积分 En - Boost C++ 函数库
PrevUpHomeNext
概要
#include <boost/math/special_functions/expint.hpp>
namespace boost{ namespace math{

template <class T>
BOOST_MATH_GPU_ENABLED calculated-result-type expint(unsigned n, T z);

template <class T, class Policy>
BOOST_MATH_GPU_ENABLED calculated-result-type expint(unsigned n, T z, const Policy&);

}} // namespaces

这些函数的返回类型是使用 结果类型计算规则 计算得出的:如果 T 是整数类型,则返回类型为 double,否则为 T。

最后一个 Policy 参数是可选的,可用于控制函数的行为:如何处理错误,使用何种精度级别等。有关更多详细信息,请参阅 策略文档

描述
template <class T>
BOOST_MATH_GPU_ENABLED calculated-result-type expint(unsigned n, T z);

template <class T, class Policy>
BOOST_MATH_GPU_ENABLED calculated-result-type expint(unsigned n, T z, const Policy&);

返回 z 的 指数积分 En

精度

下表显示了在各种平台上使用各种浮点类型时发现的最大误差(以 epsilon 为单位),以及与其他库的比较。除非另有说明,任何比此处显示的类型更窄的浮点类型将具有 有效零误差

表 8.77。expint (En) 的误差率

GNU C++ 版本 7.1.0
linux
double

GNU C++ 版本 7.1.0
linux
long double

Sun 编译器版本 0x5150
Sun Solaris
long double

Microsoft Visual C++ 版本 14.1
Win32
double

指数积分 En

最大值 = 0.589ε (平均值 = 0.0331ε)

(GSL 2.1:最大值 = 58.5ε (平均值 = 17.1ε))

最大值 = 9.97ε (平均值 = 2.13ε)

最大值 = 9.97ε (平均值 = 2.13ε)

最大值 = 7.16ε (平均值 = 1.85ε)

指数积分 En:小 z 值

最大值 = 0ε (平均值 = 0ε)

(GSL 2.1:最大值 = 115ε (平均值 = 23.6ε))

最大值 = 1.99ε (平均值 = 0.559ε)

最大值 = 1.99ε (平均值 = 0.559ε)

最大值 = 2.62ε (平均值 = 0.531ε)

指数积分 E1

最大值 = 0.556ε (平均值 = 0.0625ε)

(GSL 2.1:最大值 = 0.988ε (平均值 = 0.469ε))

最大值 = 0.965ε (平均值 = 0.414ε)

最大值 = 0.965ε (平均值 = 0.408ε)

最大值 = 0.988ε (平均值 = 0.486ε)


测试

这些函数的测试分为两部分:基本的健全性检查使用通过 Mathworld 在线评估器计算的抽样值,而精度检查则使用以 1000 位精度与 NTL::RR 和此实现计算的高精度测试值。请注意,这些函数的通用版本和特定类型版本在内部使用不同的实现,因此这为我们提供了相对独立的测试数据。使用我们的测试数据来测试其他“已知良好”的实现也提供了额外的健全性检查。

实现

该函数的通用版本使用连分式

用于较大的 x,以及无穷级数

用于较小的 x

x 的精度在编译时已知且精度为 113 位或更少时,则对于 n == 1 的情况,使用 JM 设计的有理逼近。

对于 x < 1,逼近形式为最小极大逼近

而对于 x > 1,则采用切比雪夫插值逼近形式


PrevUpHomeNext