expf.c
1.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
=============================================================================
Copyright (C) 1997-1999 NINTENDO Co.,Ltd.
$RCSfile: expf.c,v $
$Revision: 1.1.1.1 $
$Date: 2002/10/30 02:07:09 $
=============================================================================
関数名:expf
-----------------------------------------------------------------------------
書式: #include <math.h>
float expf(float x);
引数: x 指数
戻り値:指数関数 e の 引数 x 乗の値
説明: 指数関数 e の 引数 x 乗を計算する。
exp(x) = 1 + x + x^2/2! + x^3/3! + x^4 /4! +....... (-1<= x <=1)
exp(nk*log2+xx) = exp(nk * log2) * exp(xx)
= 2^nk * exp(xx)
-----------------------------------------------------------------------------
*/
#include "math.h"
float expf(float x)
{
float e, a, ebk;
float xx, xa;
int n, nk;
xa = fabsf(x);
if (xa < FLT_EPSILON) return 1.0; /* exp(0) */
nk = xa / FVAL_LOG2;
if (nk > 1024) {
if (x>=0) {return FLT_MAX; } /* ovver flow */
else { return FVAL_ZERO; } /* under flow */
}
xx = xa - (nk * FVAL_LOG2);
n = 1; e = 1; a = 1;
do {
ebk = e;
a *= xx/n;
e += a;
n++;
} while (e != ebk);
while(nk) {
e *= 2.0;
nk--;
}
if (x>=0) return e;
else return 1/e;
}