std::exp, std::expf, std::expl

来自cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
在标头 <cmath> 定义
(1)
float       exp (float num );

double      exp (double num );

longdouble exp (longdouble num );
(C++23 前)
/* 浮点数类型 */
            exp (/* 浮点数类型 */ num );
(C++23 起)
(C++26 起 constexpr)
float       expf(float num );
(2) (C++11 起)
(C++26 起为 constexpr)
longdouble expl(longdouble num );
(3) (C++11 起)
(C++26 起为 constexpr)
SIMD 重载(C++26 起)
在标头 <simd> 定义
template</*math-floating-point*/ V >

constexpr/*deduced-simd-t*/<V>

            exp (const V& v_num );
(S) (C++26 起)
额外重载(C++11 起)
在标头 <cmath> 定义
template<class Integer >
double      exp ( Integer num );
(A) (C++26 起为 constexpr)
1-3) 计算 e自然常数2.7182818...)的 num 次幂。标准库提供所有以无 cv 限定的浮点数类型作为形参的类型的 std::exp 重载。(C++23 起)
S) SIMD 重载对 v_num 实施逐元素 std::exp
(参见 math-floating-pointdeduced-simd-t 的定义。)
(C++26 起)
A) 为所有整数类型提供额外重载,将它们当做 double
(C++11 起)

目录

[编辑]参数

num - 浮点数或整数

[编辑]返回值

如果没有发生错误,那么返回 num 的底 e 指数(enum
)。

如果发生上溢导致的值域错误,那么返回 +HUGE_VAL+HUGE_VALF+HUGE_VALL

如果发生下溢导致的值域错误,那么返回(舍入后的)正确结果。

[编辑]错误处理

报告 math_errhandling 中指定的错误。

如果实现支持 IEEE 浮点数算术(IEC 60559),那么

  • 如果实参是 ±0,那么返回 1
  • 如果实参是 -∞,那么返回 +0
  • 如果实参是 +∞,那么返回 +∞
  • 如果实参是 NaN,那么返回 NaN

[编辑]注解

对于 IEEE 兼容的 double 类型,在 709.8 < num 时保证上溢,并在 num < -708.4 时保证下溢。

额外重载不需要以 (A) 的形式提供。它们只需要能够对它们的整数类型实参 num 确保 std::exp(num)std::exp(static_cast<double>(num)) 的效果相同。

[编辑]示例

#include <cerrno>#include <cfenv>#include <cmath>#include <cstring>#include <iomanip>#include <iostream>#include <numbers>   // #pragma STDC FENV_ACCESS ON   consteval double approx_e(){longdouble e{1.0};for(auto fac{1ull}, n{1llu}; n !=18;++n, fac *= n) e +=1.0/ fac;return e;}   int main(){std::cout<<std::setprecision(16)<<"exp(1) = e¹ = "<< std::exp(1)<<'\n'<<"numbers::e = "<<std::numbers::e<<'\n'<<"approx_e = "<< approx_e()<<'\n'<<"$100 在 1 年连续复利 3% 后,本金 + 利息 = "<<std::setprecision(6)<<100* std::exp(0.03)<<'\n';   // 特殊值std::cout<<"exp(-0) = "<< std::exp(-0.0)<<'\n'<<"exp(-Inf) = "<< std::exp(-INFINITY)<<'\n';   // 错误处理errno=0;std::feclearexcept(FE_ALL_EXCEPT);   std::cout<<"exp(710) = "<< std::exp(710)<<'\n';   if(errno==ERANGE)std::cout<<" errno == ERANGE: "<<std::strerror(errno)<<'\n';if(std::fetestexcept(FE_OVERFLOW))std::cout<<" 发生 FE_OVERFLOW\n";}

可能的输出:

exp(1) = e¹ = 2.718281828459045 numbers::e = 2.718281828459045 approx_e = 2.718281828459045 $100 在 1 年连续复利 3% 后,本金 + 利息 = 103.045 exp(-0) = 1 exp(-Inf) = 0 exp(710) = inf errno == ERANGE: Numerical result out of range 发生 FE_OVERFLOW

[编辑]参阅

(C++11)(C++11)(C++11)
返回 2 的给定次幂(2x
(函数)[编辑]
(C++11)(C++11)(C++11)
返回 e 的给定次幂减 1ex-1
(函数)[编辑]
(C++11)(C++11)
计算自然(以 e 为底)对数(ln(x)
(函数)[编辑]
e 为底复数的指数
(函数模板)[编辑]
应用函数 std::exp 到 valarray 的每个元素
(函数模板)[编辑]
exp 的 C 文档
close