Coding & Programming/C, C++

[C/C++] C언어 수학 함수(round, ceil, floor) 직접 구현 하기(예제포함)

mainCodes 2021. 4. 10. 10:46

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

지난번에는 abs(), fabs(), sqrt(), pow() 수학 함수를 직접 구현하여 C/C++ 라이브러리 함수와 비교하는 자료를 포스팅하였습니다. 이번에는 추가적으로 다음 3개 수학 함수들을 직접 구현하여 컴파일러가 제공하는 라이브러리 함수와 비교하고자 합니다.

  o 반올림 값을 구하는 round() 함수
  o 소수점 올림 값을 구하는 ceil() 함수
  o 소수점 내림 값을 리턴하는 floor() 함수

구현한 사용자 함수가 올바른 결과 값이 구해지는지의 검증은 지난 번과 마찬가지로 동일한 실험 데이터를 가지고 C/C++ 라이브러리 함수와 비교하였습니다.

    double r[] = { 3.2, 3.7, -3.2, -3.7, 5.1, -6.6 };
    double c[] = { 4.12, -4.12, 2.72, -2.72, 5 };

 

수학 함수 결과  비교(사용자 정의 함수 vs. C/C++ 라이브러리 함수):
* m_round <-> round, m_ceil <-> ceil, m_floor <-> floor

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define LINE1       "----------------------------------------------"
#define TEST_COUNT  5
 
/*
사용자 함수 정의
*/
 
//반올림 함수
double m_round(double n)
{
    int r;
    if (n >= 0) {
        r = n + 0.5;
        return r;
    }
    else {
        r = n - 0.5;
        return r;
    }
}
 
//소수점 올림 함수
double m_ceil(double n)
{
    int r = (int)n;
 
    if (n < 0 || n == (double)r)
        return r;
    else
        return r + 1;
}
 
//소수점 내림 함수
double m_floor(double n)
{
    double r;
 
    r = (int)n - ((n > 0) ? 0 : 1);
 
    return r;
}
 
int main()
{
    double r[] = { 3.23.7-3.2-3.75.1-6.6 };
    double c[] = { 4.12-4.122.72-2.725 };
 
    /////////////////////////////
    /* 00. m_round() 반올림 함수 시험
   *******************************************/
    puts(LINE1);
    printf(" >> round vs. m_round : 반올림 함수 시험\n");
    puts(LINE1);
    for (int i = 0; i < TEST_COUNT; i++)
    {
        printf("[라이브러리] %.2f -> %.1f\n", r[i], round(r[i]));
        printf("[만든  함수] %.2f -> %.1f\n", r[i], m_round(r[i]));
        puts("");
    }
    puts("");
 
    /* 00. m_ceil() 소수점 올림 함수 시험
    *******************************************/
    puts(LINE1);
    printf(" >> ceil vs. m_ceild : 소수점 올림 함수 시험\n");
    puts(LINE1);
    for (int i = 0; i < TEST_COUNT; i++)
    {
        printf("[라이브러리] %.2f -> %.1f\n", c[i], ceil(c[i]));
        printf("[만든  함수] %.2f -> %.1f\n", c[i], m_ceil(c[i]));
        puts("");
    }
    puts("");
 
    /* 00. m_floor() 소수점 내림 함수 시험
    *******************************************/
    puts(LINE1);
    printf(" >> flood vs. m_flood : 소수점 내림 함수 시험\n");
    puts(LINE1);
    for (int i = 0; i < TEST_COUNT; i++)
    {
        printf("[라이브러리] %.2f -> %.1f\n", c[i], floor(c[i]));
        printf("[만든  함수] %.2f -> %.1f\n", c[i], m_floor(c[i]));
        puts("");
    }
    puts("");
 
    return 0;
}
cs


실행결과(Output):

 

실험 결과 C/C++ 라이브러리 함수와 동일하게 결과가 계산된 것을 확인하였습니다. 조금이라도 도움이 되었으면 좋겠습니다. 이상 JollyTree였습니다 (•̀ᴗ•́)و