/* exp.c
*
* Exponential function
*
*
*
* SYNOPSIS :
*
* double x , y , exp ( ) ;
*
* y = exp ( x ) ;
*
*
*
* DESCRIPTION :
*
* Returns e ( 2 . 71828 . . . ) raised to the x power .
*
* Range reduction is accomplished by separating the argument
* into an integer k and fraction f such that
*
* x k f
* e = 2 e .
*
* A Pade ' form 1 + 2 x P ( x * * 2 ) / ( Q ( x * * 2 ) - P ( x * * 2 ) )
* of degree 2 / 3 is used to approximate exp ( f ) in the basic
* interval [ - 0 . 5 , 0 . 5 ] .
*
*
* ACCURACY :
*
* Relative error :
* arithmetic domain # trials peak rms
* DEC + - 88 50000 2 . 8 e - 17 7 . 0 e - 18
* IEEE + - 708 40000 2 . 0 e - 16 5 . 6 e - 17
*
*
* Error amplification in the exponential function can be
* a serious matter . The error propagation involves
* exp ( X ( 1 + delta ) ) = exp ( X ) ( 1 + X * delta + . . . ) ,
* which shows that a 1 lsb error in representing X produces
* a relative error of X times 1 lsb in the function .
* While the routine gives an accurate result for arguments
* that are exactly represented by a double precision
* computer number , the result contains amplified roundoff
* error for large arguments not exactly represented .
*
*
* ERROR MESSAGES :
*
* message condition value returned
* exp underflow x < MINLOG 0 . 0
* exp overflow x > MAXLOG INFINITY
*
*/
/*
Cephes Math Library Release 2 . 8 : June , 2000
Copyright 1984 , 1995 , 2000 by Stephen L . Moshier
*/
/* Exponential function */
#include "mconf.h"
#ifdef UNK
static double P[] = {
1 .26177193074810590878 E-4 ,
3 .02994407707441961300 E-2 ,
9 .99999999999999999910 E-1 ,
};
static double Q[] = {
3 .00198505138664455042 E-6 ,
2 .52448340349684104192 E-3 ,
2 .27265548208155028766 E-1 ,
2 .00000000000000000009 E0,
};
static double C1 = 6 .93145751953125 E-1 ;
static double C2 = 1 .42860682030941723212 E-6 ;
#endif
#ifdef DEC
static unsigned short P[] = {
0035004 ,0047156 ,0127442 ,0057502 ,
0036770 ,0033210 ,0063121 ,0061764 ,
0040200 ,0000000 ,0000000 ,0000000 ,
};
static unsigned short Q[] = {
0033511 ,0072665 ,0160662 ,0176377 ,
0036045 ,0070715 ,0124105 ,0132777 ,
0037550 ,0134114 ,0142077 ,0001637 ,
0040400 ,0000000 ,0000000 ,0000000 ,
};
static unsigned short sc1[] = {0040061 ,0071000 ,0000000 ,0000000 };
#define C1 (*(double *)sc1)
static unsigned short sc2[] = {0033277 ,0137216 ,0075715 ,0057117 };
#define C2 (*(double *)sc2)
#endif
#ifdef IBMPC
static unsigned short P[] = {
0 x4be8,0 xd5e4,0 x89cd,0 x3f20,
0 x2c7e,0 x0cca,0 x06d1,0 x3f9f,
0 x0000,0 x0000,0 x0000,0 x3ff0,
};
static unsigned short Q[] = {
0 x5fa0,0 xbc36,0 x2eb6,0 x3ec9,
0 xb6c0,0 xb508,0 xae39,0 x3f64,
0 xe074,0 x9887,0 x1709,0 x3fcd,
0 x0000,0 x0000,0 x0000,0 x4000,
};
static unsigned short sc1[] = {0 x0000,0 x0000,0 x2e40,0 x3fe6};
#define C1 (*(double *)sc1)
static unsigned short sc2[] = {0 xabca,0 xcf79,0 xf7d1,0 x3eb7};
#define C2 (*(double *)sc2)
#endif
#ifdef MIEEE
static unsigned short P[] = {
0 x3f20,0 x89cd,0 xd5e4,0 x4be8,
0 x3f9f,0 x06d1,0 x0cca,0 x2c7e,
0 x3ff0,0 x0000,0 x0000,0 x0000,
};
static unsigned short Q[] = {
0 x3ec9,0 x2eb6,0 xbc36,0 x5fa0,
0 x3f64,0 xae39,0 xb508,0 xb6c0,
0 x3fcd,0 x1709,0 x9887,0 xe074,
0 x4000,0 x0000,0 x0000,0 x0000,
};
static unsigned short sc1[] = {0 x3fe6,0 x2e40,0 x0000,0 x0000};
#define C1 (*(double *)sc1)
static unsigned short sc2[] = {0 x3eb7,0 xf7d1,0 xcf79,0 xabca};
#define C2 (*(double *)sc2)
#endif
#ifdef ANSIPROT
extern double polevl ( double , void *, int );
extern double p1evl ( double , void *, int );
extern double floor ( double );
extern double ldexp ( double , int );
extern int isnan ( double );
extern int isfinite ( double );
#else
double polevl(), p1evl(), floor(), ldexp();
int isnan(), isfinite();
#endif
extern double LOGE2, LOG2E, MAXLOG, MINLOG, MAXNUM;
#ifdef INFINITIES
extern double INFINITY;
#endif
double exp(x)
double x;
{
double px, xx;
int n;
#ifdef NANS
if ( isnan(x) )
return (x);
#endif
if ( x > MAXLOG)
{
#ifdef INFINITIES
return ( INFINITY );
#else
mtherr( "exp" , OVERFLOW );
return ( MAXNUM );
#endif
}
if ( x < MINLOG )
{
#ifndef INFINITIES
mtherr( "exp" , UNDERFLOW );
#endif
return (0 .0 );
}
/* Express e**x = e**g 2**n
* = e * * g e * * ( n loge ( 2 ) )
* = e * * ( g + n loge ( 2 ) )
*/
px = floor( LOG2E * x + 0 .5 ); /* floor() truncates toward -infinity. */
n = px;
x -= px * C1;
x -= px * C2;
/* rational approximation for exponential
* of the fractional part :
* e * * x = 1 + 2 x P ( x * * 2 ) / ( Q ( x * * 2 ) - P ( x * * 2 ) )
*/
xx = x * x;
px = x * polevl( xx, P, 2 );
x = px/( polevl( xx, Q, 3 ) - px );
x = 1 .0 + 2 .0 * x;
/* multiply by power of 2 */
x = ldexp( x, n );
return (x);
}
Messung V0.5 in Prozent C=97 H=100 G=98
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-19)
¤
*© Formatika GbR, Deutschland