반응형

앞 포스팅들을 다시 읽어보니 뭔가 마무리가 되지 않은 느낌이 들었다.

pow() 함수가 없기 때문인 것 같아서 이것까지 마저 만들기로 했다.

 

이미 ln()과 exp() 함수가 있기 때문에 구현 자체는 어려운 게 없다.

아래 적힌 관계만 이용하면 된다.

 

 

여기서 유의해야 될 점은 몇 가지 예외조건이 있다는 것이다.

이런 점을 고려한 코드는 아래와 같다.

 

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
double EXP(const double x, const double limit) {
    double result = 1 + x;
 
    double x0 = x;
    int count = 1;
    while (true) {
        ++count;
        x0 = x0 * x / count;
 
        if (isinf(x0)) {
            break;
        }
 
        result += x0;
 
        if (fabs(x0) < limit) {
            break;
        }
    }
 
    return result;
}
 
double LN_e(double y) {
    double result = 0;
 
    if (y <= 0) {
        return INFINITY;
    }
 
    int N = 0;
    while (y >= 2) { ++N; y /= E; }
    while (y <= 0.4) { --N; y *= E; }
 
    const double x = (y - 1) / (y + 1);
    const double xx = x * x;
 
    double xxT1 = x;
    double xxT2;
 
    result = x;
    int i2 = 3;
    for (int i = 0; i < 20; ++i, i2 += 2) {
        xxT1 *= xx;
        xxT2 = xxT1 / i2;
 
        result += xxT2;
    }
 
    result = result + result + N;
 
    return result;
}
 
double POW(const double a, const double b, const double limit) {
    if ((fabs(a) < limit) && (fabs(b) < limit)) {
        return INFINITY;
    }
 
    if (fabs(a) < limit) {
        return 0;
    }
 
    if ((((1 - limit) < a) && (a < (1 + limit))) ||
        fabs(b) < limit) {
        return 1;
    }
 
    if (((1 - limit) < b) && (b < (1 + limit))) {
        return a;
    }
 
    return (EXP(b * LN_e(a), limit));
}

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band