Coding & Programming/C, C++

[C/C++] C언어 수학 함수(pow, sqrt, abs, fabs) 직접 구현 하기(예제포함)

mainCodes 2021. 4. 9. 11:45

안녕하세요 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[]    = { -203040-5099-999 };
    double a2[] = { -203040-5099-999 };
    double s[]  = { 985.430.128122.54};
    double p1[] = { 23456 };
    double p2[] = { 210353 };
 
    /* 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였습니다 (•̀ᴗ•́)و