안녕하세요 JollyTree입니다 (•̀ᴗ•́)و
C/C++ 언어는 기본적으로 많은 수학 관련 함수를 지원합니다. 수학 과련 함수들을 사용하기 위해서는 #include <math.h>를 소스코드에 추가하여 사용합니다. 이미 준비된 라이브러리 함수를 사용하면 아주 편리하지만 이런 라이브러리 함수들이 내부적으로 어떻게 구현되어 있을까?라는 호기심이 생깁니다.
그래서 C/C++ 언어가 제공하는 수학 함수 중에 비교적 많이 사용되는 함수를 컴파일러가 제공해 주는 라이브러리를 사용하지 않고 스터디 차원에서 직접 구현해 보았습니다.
o 정수의 절대값을 계산하는 abs() 함수
o 실수의 절대값을 계산하는 fabs() 함수
o 제곱근을 계산하는 sqrt() 함수
o 거듭 제곱을 계산하는 pow() 함수
직접 구현한 사용자 정의 함수의 이름은 각각 m_pow, m_sqrt, m_abs, m_fabs이며 예제를 통해 C/C++ 언어가 기본적으로 제공하는 라이브러리 함수와 결과를 비교하였습니다. 결과를 비교하는 이유는 함수가 제대로 구현되었는지 동일한 실험 데이터를 가지고 검증하기 위함입니다.
int a1[] = { -20, 30, 40, -50, 99, -999 };
double a2[] = { -20, 30, 40, -50, 99, -999 };
double s[] = { 9, 85.4, 30.12, 81, 22.54};
double p1[] = { 2, 3, 4, 5, 6 };
double p2[] = { 2, 10, 3, 5, 3 };
수학 함수 결과 비교(사용자 정의 함수 vs. C/C++ 라이브러리 함수):
* m_abs <-> abs, m_fabs <-> fabs, m_sqrt <-> sqrt, m_pow <-> pow
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LINE1 "---------------------------------------------------"
#define TEST_COUNT 5
/* 사용자 정의 함수
*/
//정수 절대값 구하는 함수
int m_abs(int n)
{
if (n > 0)
return n;
else
return n * (-1);
}
//실수 절대값 구하는 함수
double m_fabs(double n)
{
if (n > 0)
return n;
else
return n * (-1);
}
//거듭 제곱 함수
double m_pow(double n, double m)
{
double nn = n;
if (m == 0) return 1.0; for (int i = 0; i < (m-1); i++)
n *= nn; return n;
}
//제곱근 함수
double m_sqrt(double n)
{
double s=0;
double t=0;
s = n / 2;
for (;s != t;)
{
t = s;
s = ( (n / t) + t) / 2;
}
return s;
}
int main()
{
int a1[] = { -20, 30, 40, -50, 99, -999 };
double a2[] = { -20, 30, 40, -50, 99, -999 };
double s[] = { 9, 85.4, 30.12, 81, 22.54};
double p1[] = { 2, 3, 4, 5, 6 };
double p2[] = { 2, 10, 3, 5, 3 };
/* 11. m_abs() 절대값 함수 시험 #1(정수)
*******************************************/
puts(LINE1);
printf(" >> abs vs. m_abs : 절대값 함수 구현&시험 #1(정수)\n");
puts(LINE1);
for (int i = 0; i < TEST_COUNT; i++)
{
printf("[라이브러리] %d -> %d\n", a1[i], abs(a1[i]));
printf("[만든 함수] %d -> %d\n", a1[i], m_abs(a1[i]));
puts("");
}
puts("");
/* 2. m_fabs() 절대값 함수 시험 #2(실수)
*******************************************/
puts(LINE1);
printf(" >> fabs vs. m_fabs : 절대값 함수 구현&시험 #2(실수)\n");
puts(LINE1);
for (int i = 0; i < TEST_COUNT; i++)
{
printf("[라이브러리] %0.1f -> %.1f\n", a2[i], fabs(a2[i]));
printf("[만든 함수] %0.1f -> %.1f\n", a2[i], m_fabs(a2[i]));
puts("");
}
puts("");
/* 3. m_sqrt() 제곱근 함수 시험
*******************************************/
puts(LINE1);
printf(" >> sqrt vs. m_sqrt : 제급근 함수 구현&시험\n");
puts(LINE1);
for (int i = 0; i < TEST_COUNT; i++)
{
printf("[라이브러리] %.2f -> %f\n", s[i], sqrt(s[i]));
printf("[만든 함수] %.2f -> %f\n", s[i], m_sqrt(s[i]));
puts("");
}
puts("");
/* 4. m_pow() 거듭 제곱근 함수 시험
*******************************************/
puts(LINE1);
printf(" >> pow vs. m_pow : 거듭 제곱 함수 구현&시험\n");
puts(LINE1);
for (int i = 0; i < TEST_COUNT; i++)
{
printf("[라이브러리] %.2f의 %.2f 제곱 -> %.2f\n", p1[i], p2[i], pow(p1[i], p2[i]));
printf("[만든 함수] %.2f의 %.2f 제곱 -> %.2f\n", p1[i], p2[i], m_pow(p1[i], p2[i]));
puts("");
}
puts("");
return 0;
}
|
cs |
실행결과(Output):
실험 결과 C/C++ 라이브러리 함수와 동일하게 결과가 계산된 것을 확인하였습니다. 이상 JollyTree였습니다 (•̀ᴗ•́)و
'Coding & Programming > C, C++' 카테고리의 다른 글
[C/C++] ASCII 코드값을 이용하여 문자열 내 알파벳, 대소문자, 공백, 숫자 식별(분류)하기 + 대소문자 변환하기 (0) | 2021.04.12 |
---|---|
[C/C++] C언어 수학 함수(round, ceil, floor) 직접 구현 하기(예제포함) (2) | 2021.04.10 |
[C/C++] 정수(int)와 문자열(string) 상호 변환하기(itoa, atoi, sprintf, snprintf function examples) (4) | 2021.04.08 |
[C/C++] 단위 변환(길이, 시간, 온도, 속도, 넓이, 무게) 하기 (0) | 2021.03.22 |
[C/C++] 배열 메모리 초기화(리셋) 및 복사(reset array & copy array) (0) | 2021.03.21 |