#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 |
GNU C++ 版本 7.1.0 |
Sun 编译器版本 0x5150 |
Microsoft Visual C++ 版本 14.1 |
|
---|---|---|---|---|
指数积分 En |
最大值 = 0.589ε (平均值 = 0.0331ε) |
最大值 = 9.97ε (平均值 = 2.13ε) |
最大值 = 9.97ε (平均值 = 2.13ε) |
最大值 = 7.16ε (平均值 = 1.85ε) |
指数积分 En:小 z 值 |
最大值 = 0ε (平均值 = 0ε) |
最大值 = 1.99ε (平均值 = 0.559ε) |
最大值 = 1.99ε (平均值 = 0.559ε) |
最大值 = 2.62ε (平均值 = 0.531ε) |
指数积分 E1 |
最大值 = 0.556ε (平均值 = 0.0625ε) |
最大值 = 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
,则采用切比雪夫插值逼近形式
。