<개인공부>/[C언어, C++]

[C언어/C++] 절대값 함수 abs, fabs에 대해서.

BlockDMask 2019. 3. 18. 00:41
반응형

안녕하세요. BlockDMask 입니다.

오늘은 절대값을 구할 수 있는 절대값 함수 abs에 대해서 알아보려고 합니다.

<목차>

1. C 언어에서의 abs, fabs 함수 (헤더파일과 함수 원형)

2. C++에서의 std::abs 함수 (헤더파일과 함수 원형)

3. C언어 abs, fabs 함수 예제

4. C++ std::abs 함수 예제


1. C 언어에서의 abs, fabs 함수 (헤더파일과 함수 원형)


절대값 함수는 특이하게도 abs가 있는 헤더와 fabs가 존재하는 헤더파일이 다릅니다.


▼ C언어 abs 함수

헤더파일 : <stdlib.h>

함수원형 : int abs(int num);

함수설명 : 인자로 들어온 int 타입의 num의 절대값을 반환하는 함수


▼ C언어 fabs 함수

헤더파일 : <math.h>

함수원형 : double fabs(double num);

함수설명 : 인자로 들어온 double 타입의 num의 절대값을 반환하는 함수


위에서 보시는것처럼 abs 함수는 stdlib.h에 존재하고, fabs 함수는 math.h에 존재합니다.


2. C++에서의 std::abs 함수 (헤더파일과 함수 원형)


C++에서는 함수 오버로딩(overloading)이 존재하기 때문에 abs 함수 이름 하나만 존재하지만,,,

이게 좀 이상합니다.

int 타입의 정수 절대값 함수(abs)의 오버로딩은 <cstdlib>에 존재하고,

float, double 타입의 실수 절대값 함수(abs)의 오버로딩은 <cmath>에 존재합니다.


아무래도 C언어와 C++의 호환성을 위해서, 

C언어에서 정수관련 절대값 함수 abs를 <stdlib.h>에 선언을 했기때문에 여기서는 C++ 스타일 정수 타입 abs함수 오버로딩을 하고,

C언어에서 실수관련 절대값 함수 fabs 함수는 <math.h>에 선언이 되어있기 때문에 이걸 C++ 스타일 실수형태 abs 함수화 한 것 으로 추측 됩니다.

그리고 <cmath> 헤더에 fabs 도 있습니다. 하지만, <cmath>헤더에 있는 abs와 fabs 둘다 동일하다는 말씀. 이것도 C언어와의 호환성을 위해 남겨둔것으로 추측됩니다.


▼ C++ abs 함수1

헤더파일 : <cstdlib>

함수원형1 : int abs(int num);

함수원형2 : long int abs(long int num);

함수원형3 : long long int abs(long long int num);

함수설명 : 인자로 들어온 정수타입에 맞는 abs 함수가 불리게 되고, 정수로 들어온 수(num)는 절대값으로 바꾸어서 반환 됩니다.


▼C++ abs 함수2

헤더파일 : <cmath>

함수원형1 : double abs(double num)

함수원형2 : float abs(float num)

함수원형3 : long double abs(long double num)

함수원형4 : double abs(T x);

함수설명 : 인자로 들어온 실수 타입에 맞는 abs 함수가 불리게 되며, 인자로 넣은 데이터 타입과 동일한 데이터 타입의 절대값을 반환하는 함수.

(함수원형4에 존재하는 T가 무엇인지 궁금하다면 template [바로가기])


3. C언어 abs, fabs 함수 예제


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
//C abs(), fabs() example
//BlockDMask
#include<stdio.h>
#include<stdlib.h>    //abs()
#include<math.h>    //fabs()
 
int main(void)
{
    int num1 = -31;
    int num2 = 21;
    double num3 = -34.56;
    double num4 = -14.21;
 
    printf("[C abs(), fabs() example]\n");
    //int type abs()
    printf("abs(- int) : %d\n", abs(num1));
    printf("abs(+ int) : %d\n", abs(num2));
 
    //double type fabs()
    printf("fabs(- double) : %f\n", fabs(num3));
    printf("fabs(+ double) : %f\n", fabs(num4));
 
    printf("\n");
    system("pause");
    return 0;
}
cs


▲C언어 abs, fabs 예제 결과


4. C++ std::abs 함수 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//C++ abs example
//BlockDMask
#include<iostream>
#include<cmath>    //abs for float, double
#include<cstdlib> //abs for int, long int
using namespace std;
int main(void)
{
    int a1 = -1111;
    int a2 = 1000;
    float b1 = -22.22f;
    float b2 = 20.22f;
 
    cout << "[C++ abs() example]" << endl;
    cout << "abs(- int) : " << abs(a1) << endl;
    cout << "abs(+ int) : " << abs(a2) << endl;
    cout << "abs(- float) : " << abs(b1) << endl;
    cout << "abs(+ float) : " << abs(b2) << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲C++ abs 예제 결과


감사합니다. 또 오세요~

반응형