欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

exp

程序员文章站 2024-02-27 16:41:39
...

exp

C99
double exp(double x);
float expf(float x);
long double expl(long double x);
C++11
double exp (double x);
float exp (float x);
long double exp (long double x);
double exp (T x); // additional overloads for integral types
1. Compute exponential function
        Returns the base-e exponential function of x, which is e raised to the power x: e^x.
C99
        Header <tgmath.h> provides a type-generic macro version of this function.
C++98
        This function is overloaded in <complex> and <valarray> (see complex exp and valarray exp).
C++11
        Additional overloads are provided in this header (<cmath>) for the integral types: These overloads effectively cast x to a double before calculations.
        This function is also overloaded in <complex> and <valarray> (see complex exp and valarray exp).
1.1 Parameters
x
        Value of the exponent.
1.2 Return Value
        Exponential value of x.
        If the magnitude of the result is too large to be represented by a value of the return type, the function returns HUGE_VAL (or HUGE_VALF or HUGE_VALL) with the proper sign, and an overflow range error occurs:
C90 (C++98)
        If an overflow range error occurs, the global variable errno is set to ERANGE.
C99 (C+11)
        If an overflow range error occurs:
        - And math_errhandling has MATH_ERRNO set: the global variable errno is set to ERANGE.
        - And math_errhandling has MATH_ERREXCEPT set: FE_OVERFLOW is raised.
2. Example
2.1 example

/*
 ============================================================================
 Name        : exp_example_1.c
 Author      : foreverstrong
 Version     :
 Copyright   : Your copyright notice
 Description : exp, expf, expl in C, Ansi-style
 ============================================================================
 */

/* exp example */
#include <stdio.h>      /* printf */
#include <math.h>       /* exp */

int main()
{
	double param, result;
	param = 5.0;
	result = exp(param);
	printf("The exponential value of %f is %f.\n", param, result);

	return 0;
}
Output:
The exponential value of 5.000000 is 148.413159.
3. exp, expf, expl
        Defined in header <math.h>

float expf(float arg); (1) (since C99)
double exp(double arg); (2) 
long double expl(long double arg); (3) (since C99)
        Defined in header <tgmath.h>
#define exp(arg) (4) (since C99)
        1-3) Computes the e (Euler's number, 2.7182818) raised to the given power arg.
        4) Type-generic macro: If arg has type long double, expl is called. Otherwise, if arg has integer type or the type double, exp is called. Otherwise, expf is called. If arg is complex or imaginary, then the macro invokes the corresponding complex function (cexpf, cexp, cexpl).
3.1 Parameters
        arg - floating point value
3.2 Return value
        If no errors occur, the base-e exponential of arg (e^arg) is returned.
        若不出现错误,则返回 arg 的底 e 指数 (e^arg)
        If a range error due to overflow occurs, +HUGE_VAL, +HUGE_VALF, or +HUGE_VALL is returned.
        If a range error occurs due to underflow, the correct result (after rounding) is returned.
        若出现下溢所致的值域错误,则返回 (舍入后的) 正确结果。
3.3 Error handling
       Errors are reported as specified in math_errhandling.
       If the implementation supports IEEE floating-point arithmetic (IEC 60559),
        If the argument is ±0, 1 is returned
        If the argument is -∞, +0 is returned
        If the argument is +∞, +∞ is returned
        If the argument is NaN, NaN is returned
3.4 Notes
        For IEEE-compatible type double, overflow is guaranteed if 709.8 < arg, and underflow is guaranteed if arg < -708.4.
4. Example
4.1 example

/*
 ============================================================================
 Name        : exp_example_2.c
 Author      : foreverstrong
 Version     :
 Copyright   : Your copyright notice
 Description : exp, expf, expl in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <errno.h>
#include <fenv.h>

#pragma STDC FENV_ACCESS ON

int main(void)
{
	printf("exp(1) = %f\n", exp(1));
	printf("FV of $100, continuously compounded at 3%% for 1 year = %f\n",
			100 * exp(0.03));

	// special values
	printf("exp(-0) = %f\n", exp(-0.0));
	printf("exp(-Inf) = %f\n", exp(-INFINITY));

	// error handling
	errno = 0;
	feclearexcept(FE_ALL_EXCEPT);
	printf("exp(710) = %f\n", exp(710));
	if (errno == ERANGE)
	{
		perror("    errno == ERANGE");
	}
	if (fetestexcept(FE_OVERFLOW))
	{
		puts("    FE_OVERFLOW raised");
	}

	return 0;
}
Compiler messages:
15:50:07 **** Build of configuration Debug for project exp_example ****
make all 
Building file: ../src/exp_example_1.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/exp_example_1.d" -MT"src/exp_example_1.o" -o "src/exp_example_1.o" "../src/exp_example_1.c"
Finished building: ../src/exp_example_1.c
 
Building file: ../src/exp_example_2.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/exp_example_2.d" -MT"src/exp_example_2.o" -o "src/exp_example_2.o" "../src/exp_example_2.c"
../src/exp_example_2.c:17:0: warning: ignoring #pragma STDC FENV_ACCESS [-Wunknown-pragmas]
 #pragma STDC FENV_ACCESS ON
 ^
Finished building: ../src/exp_example_2.c
 
Building target: exp_example
Invoking: GCC C Linker
gcc  -o "exp_example"  ./src/exp_example_1.o ./src/exp_example_2.o   -lm
Finished building target: exp_example
 

15:50:08 Build Finished (took 320ms)

Possible output:
exp(1) = 2.718282
FV of $100, continuously compounded at 3% for 1 year = 103.045453
exp(-0) = 1.000000
exp(-Inf) = 0.000000
exp(710) = inf
    FE_OVERFLOW raised
    errno == ERANGE: Numerical result out of range

References
http://zh.cppreference.com/w/c/numeric/math/exp
http://en.cppreference.com/w/c/numeric/math/exp
http://www.cplusplus.com/reference/cmath/exp/



相关标签: exp