@cindex exponential function
@cindex exp

The functions described in this section are declared in the header file
@file{gsl_sf_exp.h}.

@menu
* Exponential Function::        
* Relative Exponential Functions::  
* Exponentiation With Error Estimate::  
@end menu

@node Exponential Function
@subsection Exponential Function

@deftypefun double gsl_sf_exp (double @var{x})
@deftypefunx int gsl_sf_exp_e (double @var{x}, gsl_sf_result * @var{result})
These routines provide an exponential function @math{\exp(x)} using GSL
semantics and error checking.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun

@deftypefun int gsl_sf_exp_e10_e (double @var{x}, gsl_sf_result_e10 * @var{result})
This function computes the exponential @math{\exp(x)} using the
@code{gsl_sf_result_e10} type to return a result with extended range.
This function may be useful if the value of @math{\exp(x)} would
overflow the  numeric range of @code{double}.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun

@deftypefun double gsl_sf_exp_mult (double @var{x}, double @var{y})
@deftypefunx int gsl_sf_exp_mult_e (double @var{x}, double @var{y}, gsl_sf_result * @var{result})
These routines exponentiate @var{x} and multiply by the factor @var{y}
to return the product @math{y \exp(x)}.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun

@deftypefun int gsl_sf_exp_mult_e10_e (const double @var{x}, const double @var{y}, gsl_sf_result_e10 * @var{result})
This function computes the product @math{y \exp(x)} using the
@code{gsl_sf_result_e10} type to return a result with extended numeric
range.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun



@node Relative Exponential Functions
@subsection Relative Exponential Functions

@deftypefun double gsl_sf_expm1 (double @var{x})
@deftypefunx int gsl_sf_expm1_e (double @var{x}, gsl_sf_result * @var{result})
These routines compute the quantity @math{\exp(x)-1} using an algorithm
that is accurate for small @math{x}.
@comment Exceptional Return Values:  GSL_EOVRFLW
@end deftypefun

@deftypefun double gsl_sf_exprel (double @var{x})
@deftypefunx int gsl_sf_exprel_e (double @var{x}, gsl_sf_result * @var{result})
These routines compute the quantity @math{(\exp(x)-1)/x} using an
algorithm that is accurate for small @math{x}.  For small @math{x} the
algorithm is based on the expansion @math{(\exp(x)-1)/x = 1 + x/2 +
x^2/(2*3) + x^3/(2*3*4) + \dots}.
@comment Exceptional Return Values:  GSL_EOVRFLW
@end deftypefun

@deftypefun double gsl_sf_exprel_2 (double @var{x})
@deftypefunx int gsl_sf_exprel_2_e (double @var{x}, gsl_sf_result * @var{result})
These routines compute the quantity @math{2(\exp(x)-1-x)/x^2} using an
algorithm that is accurate for small @math{x}.  For small @math{x} the
algorithm is based on the expansion @math{2(\exp(x)-1-x)/x^2 = 
1 + x/3 + x^2/(3*4) + x^3/(3*4*5) + \dots}.
@comment Exceptional Return Values:  GSL_EOVRFLW
@end deftypefun

@deftypefun double gsl_sf_exprel_n (int @var{n}, double @var{x})
@deftypefunx int gsl_sf_exprel_n_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
These routines compute the @math{N}-relative exponential, which is the
@var{n}-th generalization of the functions @code{gsl_sf_exprel} and
@code{gsl_sf_exprel2}.  The @math{N}-relative exponential is given by,
@tex
\beforedisplay
$$
\eqalign{
\hbox{exprel}_N(x)
            &= N!/x^N \left(\exp(x) - \sum_{k=0}^{N-1} x^k/k!\right)\cr
            &= 1 + x/(N+1) + x^2/((N+1)(N+2)) + \dots\cr
            &= {}_1F_1(1,1+N,x)\cr
}
$$
\afterdisplay
@end tex
@ifinfo

@example
exprel_N(x) = N!/x^N (\exp(x) - \sum_@{k=0@}^@{N-1@} x^k/k!)
            = 1 + x/(N+1) + x^2/((N+1)(N+2)) + ...
            = 1F1 (1,1+N,x)
@end example
@end ifinfo
@comment Exceptional Return Values: 
@end deftypefun



@node Exponentiation With Error Estimate
@subsection Exponentiation With Error Estimate


@deftypefun int gsl_sf_exp_err_e (double @var{x}, double @var{dx}, gsl_sf_result * @var{result})
This function exponentiates @var{x} with an associated absolute error
@var{dx}.
@comment Exceptional Return Values: 
@end deftypefun

@deftypefun int gsl_sf_exp_err_e10_e (double @var{x}, double @var{dx}, gsl_sf_result_e10 * @var{result})
This function exponentiates a quantity @var{x} with an associated absolute 
error @var{dx} using the @code{gsl_sf_result_e10} type to return a result with
extended range.
@comment Exceptional Return Values: 
@end deftypefun

@deftypefun int gsl_sf_exp_mult_err_e (double @var{x}, double @var{dx}, double @var{y}, double @var{dy}, gsl_sf_result * @var{result})
This routine computes the product @math{y \exp(x)} for the quantities
@var{x}, @var{y} with associated absolute errors @var{dx}, @var{dy}.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun


@deftypefun int gsl_sf_exp_mult_err_e10_e (double @var{x}, double @var{dx}, double @var{y}, double @var{dy}, gsl_sf_result_e10 * @var{result})
This routine computes the product @math{y \exp(x)} for the quantities
@var{x}, @var{y} with associated absolute errors @var{dx}, @var{dy} using the
@code{gsl_sf_result_e10} type to return a result with extended range.
@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
@end deftypefun

