앞 포스팅들을 다시 읽어보니 뭔가 마무리가 되지 않은 느낌이 들었다.
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)); } |
정공법으로 소수 판별 시 더 빠른 방법은? (0) | 2020.03.28 |
---|---|
대각선에서 소수의 비율이 10% 이하가 되는 값 찾기 (0) | 2020.03.26 |
테일러 급수를 이용한 sin() 및 BBP를 이용한 원주율 구현 (0) | 2020.03.22 |
테일러 급수로 구현한 ln() 함수 (0) | 2020.03.22 |
C/C++/C# 에서 간단하게 inf/NaN 확인하는 방법 (0) | 2020.02.07 |
내 블로그 - 관리자 홈 전환 |
Q
Q
|
---|---|
새 글 쓰기 |
W
W
|
글 수정 (권한 있는 경우) |
E
E
|
---|---|
댓글 영역으로 이동 |
C
C
|
이 페이지의 URL 복사 |
S
S
|
---|---|
맨 위로 이동 |
T
T
|
티스토리 홈 이동 |
H
H
|
단축키 안내 |
Shift + /
⇧ + /
|
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.