文章

【翻译】用于科学计算的 C++11/14 新特性之三

总结 C++11/14 中与科学计算相关的新特性。

原文地址 www.numbercrunch.de

【翻译】用于科学计算的 C++11/14 新特性之三

数学函数

C++11/14 引入了一些新的数学函数,这些函数都为 floatdoublelong double 类型重载,并且定义在头文件 cmath 中。下表总结了这些新函数。

函数含义
remainder除法运算的有符号余数
remquo除法运算的有符号余数和最后三个二进制位
fma混合的乘加运算
fmax两个浮点值的较大者
fmin两个浮点值的较小者
fdim两个浮点值的正数差,$\max(0,x−y)$
nan, nanf, nanl非数(NaN)
exp2返回 2 的给定次幂,$2^x$
expm1返回 e 的给定次幂减一,$e^x−1$
log2给定数值的以 2 为底的对数,$\log_2x$
log1p1 加上给定数值的自然(以 e 为底)对数,$\ln(1+x)$
cbrt计算立方根,$\sqrt[3]{x}$
hypot计算两个给定数的平方和的平方根,$\sqrt{x^2+y^2}$
asinh计算反双曲正弦
acosh计算反双曲余弦
atanh计算反双曲正切
erf误差函数
erfc补误差函数
tgammaGamma 函数
lgammaGamma 函数的自然对数
trunc绝对值不大于给定值的最接近整数
round, lround, llround最接近整数,中间情况下向远离零舍入
nearbyint使用当前舍入模式的最接近整数
rint, lrint, llrint使用当前舍入模式的最接近整数若结果有别则有异常
scalbn, scalbln将数乘以 FLT_RADIX 的幂次
ilogb提取数的指数
logb提取数的指数
nextafter, nexttoward趋向给定值的下个可表示浮点值
copysign复制浮点值的符号
fpclassify归类给定的浮点值
isfinite检查给定数是否拥有有限值
isinf检查给定数是否为无限
isnan检查给定的数是否 NaN
isnormal检查给定数是否正规
signbit检查给定数是否为负
isgreater检查第一个浮点实参是否大于第二个
isgreaterequal检查第一个浮点实参是否大于或等于第二个
isless检查第一个浮点实参是否小于第二个
islessequal检查第一个浮点实参是否小于或等于第二个
islessgreater检查第一个浮点实参是否小于或大于第二个
isunordered检查两个浮点值是否无顺序

译注:C++ 17 还新增了大量特殊函数

函数含义
assoc_laguerre, assoc_laguerref, assoc_laguerrel连带拉盖尔多项式 (函数)
assoc_legendre, assoc_legendref, assoc_legendrel连带勒让德多项式 (函数)
beta, beta发, betalbeta 函数 (函数)
comp_ellint_1, comp_ellint_1f, comp_ellint_1l第一类(完全)椭圆积分 (函数)
comp_ellint_2, comp_ellint_2f, comp_ellint_2l第二类(完全)椭圆积分 (函数)
comp_ellint_3, comp_ellint_3f, comp_ellint_3l第三类(完全)椭圆积分 (函数)
cyl_bessel_i, cyl_bessel_if, cyl_bessel_il规则变形圆柱贝塞尔函数 (函数)
cyl_bessel_j, cyl_bessel_jf, cyl_bessel_jl(第一类)圆柱贝塞尔函数 (函数)
cyl_bessel_k, cyl_bessel_kf, cyl_bessel_kl不规则变形圆柱贝塞尔函数 (函数)
cyl_neumann, cyl_neumannf, cyl_neumannl圆柱诺依曼函数 (函数)
ellint_1, ellint_1f, ellint_1l第一类(不完全)椭圆积分 (函数)
ellint_2, ellint_2f, ellint_2l第二类(不完全)椭圆积分 (函数)
ellint_3, ellint_3f, ellint_3l第三类(不完全)椭圆积分 (函数)
expint, expintf, expintl指数积分 (函数)
hermite, hermitef, hermitel埃尔米特多项式 (函数)
legendre, legendref, legendrel勒让德多项式 (函数)
laguerre, laguerref, laguerrel拉盖尔多项式 (函数)
riemann_zeta, riemann_zetaf, riemann_zetal黎曼 zeta 函数 (函数)
sph_bessel, sph_besself, sph_bessell(第一类)球面贝塞尔函数 (函数)
sph_legendre, sph_legendref, sph_legendrel球面连带勒让德函数 (函数)
sph_neumann, sph_neumannf, sph_neumannl球面诺依曼函数 (函数)

最大值最小值函数

头文件 algorithm 定义了用于确定两个可比较的相同类型(例如数字)对象的最小值或最大值的模板函数。在 C++11 中,引入了这些函数的重载版本,允许通过初始化列表传递任意数量的对象来确定最小值或最大值。此外,minmax 函数可以在单次扫描中同时确定最小值和最大值。以下代码给出了一个示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <algorithm>
 
int main() {
    int i0(0), i1(1), i2(2), i3(3), i4(4);
    // determine minimum and maximum seperately
    std::cout << "min : " << std::min({i3, i1, i2, i0, i4}) << '\n'
        << "max : " << std::max({i3, i1, i2, i0, i4}) << '\n';
    // determine minimum and maximum in a single scan
    auto min_max=std::minmax({i3, i1, i2, i0, i4});
    std::cout << "min : " << min_max.first << '\n'
        << "max : " << min_max.second << '\n';
}
本文由作者按照 CC BY 4.0 进行授权