C언어 제곱 함수 만들기 - ceon-eo jegob hamsu mandeulgi

C/C++ 언어는 기본적으로 많은 수학 관련 함수를 지원합니다. 수학 과련 함수들을 사용하기 위해서는 #include <math.h>를 소스코드에 추가하여 사용합니다. 이미 준비된 라이브러리 함수를 사용하면 아주 편리하지만 이런 라이브러리 함수들이 내부적으로 어떻게 구현되어 있을까?라는 호기심이 생깁니다.

그래서 C/C++ 언어가 제공하는 수학 함수 중에 비교적 많이 사용되는 함수를 컴파일러가 제공해 주는 라이브러리를 사용하지 않고 스터디 차원에서 직접 구현해 보았습니다.

직접 구현한 사용자 정의 함수의 이름은 각각 m_pow, m_sqrt, m_abs, m_fabs이며 예제를 통해 C/C++ 언어가 기본적으로 제공하는 라이브러리 함수와 결과를 비교하였습니다. 결과를 비교하는 이유는 함수가 제대로 구현되었는지 동일한 실험 데이터를 가지고 검증하기 위함입니다.

수학 함수 결과  비교(사용자 정의 함수 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)

{

int nn = n;

for (int i = 0; i < (m-1); i++)

*= nn;

return n;

}

//제곱근 함수

double m_sqrt(double n)

{

double s=0;

double t=0;

= n / 2;

for (;s != t;)

{

= 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

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