<개인공부>/[C++]

[C++] trunc 버림 함수에 대해서

사용자 BlockDMask 2019. 3. 19. 10:59
반응형

안녕하십니까! 오늘도 어김없이 글을 쓰는 BlockDMask 입니다.

오늘은 내림(floor)함수와 비슷하다고 생각할 수 있는 버림(trunc)함수에 대해서 슬쩍 살펴보겠습니다.

C++11에서부터 사용가능하다는 점 알려드립니다.

(C언어/C++ floor(내림), ceil(올림) 함수에 대한 포스팅. [바로가기])

(C++ round(반올림) 함수에 대한 포스팅. [바로가기])


1. C++ trunc 버림함수 함수 원형과 함수 설명


▼ trunc 함수

헤더파일 : <cmath>

함수원형1 : float trunc(float num);

함수원형2 : double trunc(double num);

함수원형3 : long double trunc(long double num);

함수원형4 : double trunc(T num);

함수설명 : 소수점 아래 수는 0으로 바꾸어 버리는 함수 입니다. 아예 버려버리는거죠. 가차없는 함수입니다. 아주 잔인한 함수에요.


(trunc 함수는 truncate 라는 단어로부터 온 것 입니다.)

(C++11부터 사용이 가능합니다.)

(C++에서는 함수 오버로딩(overloading)이 가능하기 때문에 매개변수로 들어오는 타입, 개수가 다르면 같은이름의 함수를 사용할 수 있습니다.)

(또한, 함수원형 네번째에 나와있는 T가 궁금하시다면 [바로가기])


▼ 간단하게 trunc 함수 작동을 보겠습니다.

양수 살펴보겠습니다.

trunk(3.2)는 -> 3이 반환되고

trunk(3.7)은 -> 3이 반환되겠죠?


음수 살펴보겠습니다.

trunk(-3.2)는 바로 -> -3이 반환.

trunk(-3.7)은 바로 -> -3이 반환됩니다.

참 쉽죠?


아래에는 두가지 예제가 있습니다.

하나는 trunk함수 예제가 있고,

다른 하나는 올림(ceil),내림(floor),버림(trunc),반올림(round)함수 결과를 비교해 놓은 것 입니다.

얼핏보면 버림이 내림과 다를바 없다고 생각할 수 있는데, 전혀 never 같지 않습니다.


2. C++ trunc 버림함수 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//C++ trunk example.
//BlockDMask
#include<iostream>    //cout
#include<cmath>        //round, ceil, floor, trunc
using namespace std;
 
int main(void)
{
    double a1 = 3.2;
    double a2 = 3.7;
    double a3 = -3.2;
    double a4 = -3.7;
 
    cout << "[C++] trunc example. BlockDMask" << endl;
    cout << "trunc(3.2) : " << trunc(a1) << endl;
    cout << "trunc(3.7) : " << trunc(a2) << endl;
    cout << "trunc(-3.2) : " << trunc(a3) << endl;
    cout << "trunc(-3.7) : " << trunc(a4) << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ trunc 함수 예제 결과

앞서 말씀드린 것 처럼 소수점 뒤에 있는것들을 가차 없이 버리는 잔인한 함수임을 볼 수 있습니다.


3. C++ trunc, ceil, floor, round (버림, 올림, 내림 반올림) 함수 비교


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
//C++ ceil, floor, round, trunk example.
//BlockDMask
#include<iostream>    //cout
#include<cmath>        //round, ceil, floor, trunc
using namespace std;
 
int main(void)
{
    double a1 = 3.2;
    double a2 = 3.7;
    double a3 = -3.2;
    double a4 = -3.7;
 
    cout << "[C++] round example. BlockDMask" << endl;
    cout << "origin\t round\t ceil\t floor\t trunc" << endl;
    
    cout << "  3.2\t " << round(a1) << "\t " << ceil(a1);
    cout << "\t " << floor(a1) << "\t " << trunc(a1) << endl;
    
    cout << "  3.7\t " << round(a2) << "\t " << ceil(a2);
    cout << "\t " << floor(a2) << "\t " << trunc(a2) << endl;
 
    cout << " -3.2\t " << round(a3) << "\t " << ceil(a3);
    cout << "\t " << floor(a3) << "\t " << trunc(a3) << endl;
 
    cout << " -3.7\t " << round(a4) << "\t " << ceil(a4);
    cout << "\t " << floor(a4) << "\t " << trunc(a4) << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ round, ceil, floor, trunc 함수 비교 결과

반올림은 그렇다 치고,

양수일때 ceil 값과 trunc 값이 다릅니다.

음수일때 floor 값과 trunc 값이 다릅니다.


위 예제에서 사용한 

C언어/C++ floor(내림), ceil(올림) 함수가 궁금하다면? [바로가기]

C++ round(반올림) 함수가 궁금하다면? [바로가기]


감사합니다. BlockDMask 기억해주시고, 또오세요~

반응형