Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 부동 소수점 숫자의 정밀도 다루기: floor(), ceil(), trunc(), round(), setprecision() 완벽 정리

부동 소수점 숫자의 정밀도(Precision)란 소수점 이하의 값을 저장할 수 있는 정확도를 의미합니다.

예를 들어 10/6 = 1.6666666...과 같은 순환 소수는 무한히 이어지기 때문에 저장하는 데 무한한 메모리 공간이 필요합니다.

따라서 이런 경우 메모리 오버플로우를 방지하기 위해 컴파일러는 숫자에 정밀도 제한을 설정합니다. C++에서 float 값의 정밀도는 소수점 이하 6~7자리로 설정되며, 그 이후 소수가 계속 이어지면 해당 값은 버려집니다.

값이 잘려나갈 때 발생할 수 있는 큰 오차를 방지하기 위해 C++은 부동 소수점 값의 정밀도를 제어할 수 있는 다양한 함수와 라이브러리를 제공합니다. 지금부터 하나씩 살펴보겠습니다.

floor() — 내림 함수

floor() 함수는 주어진 수보다 작거나 같은 가장 가까운 정수로 내림하는 함수입니다.

항상 부동 소수점 숫자의 정수부보다 작거나 같은 정수 값을 반환하며, 음수의 경우에도 수직선상에서 아래쪽(작은 쪽)으로 내림됩니다.

라이브러리: math.h

예제

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<floor(number1)<<endl;
    cout<<"Number 2 : "<<floor(number2)<<endl;
    cout<<"Number 3 : "<<floor(number3)<<endl;
    cout<<"Number 4 : "<<floor(number4)<<endl;
    return 0;
}

출력 결과

Values are :
Number 1 : 0
Number 2 : 234
Number 3 : -4
Number 4 : -1

ceil() — 올림 함수

ceil() 함수는 주어진 수보다 크거나 같은 가장 가까운 정수로 올림하는 함수입니다.

항상 부동 소수점 숫자의 정수부보다 크거나 같은 정수 값을 반환합니다.

라이브러리: math.h

예제

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<ceil(number1)<<endl;
    cout<<"Number 2 : "<<ceil(number2)<<endl;
    cout<<"Number 3 : "<<ceil(number3)<<endl;
    cout<<"Number 4 : "<<ceil(number4)<<endl;
    return 0;
}

출력 결과

Values are :
Number 1 : 1
Number 2 : 235
Number 3 : -3
Number 4 : -0

trunc() — 절삭 함수

trunc() 함수는 소수점 이하를 단순히 버리고 정수 부분만 남기는 함수입니다. 즉, 0을 향해 절삭(truncate)합니다.

양수에서는 floor()와 같은 결과를, 음수에서는 ceil()과 같은 결과를 반환한다는 점이 특징입니다.

라이브러리: math.h

예제

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.2342, number3 = -3.31132, number4 = -0.432;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<trunc(number1)<<endl;
    cout<<"Number 2 : "<<trunc(number2)<<endl;
    cout<<"Number 3 : "<<trunc(number3)<<endl;
    cout<<"Number 4 : "<<trunc(number4)<<endl;
    return 0;
}

출력 결과

Values are :
Number 1 : 0
Number 2 : 234
Number 3 : -3
Number 4 : -0

round() — 반올림 함수

round() 함수는 주어진 수를 가장 가까운 정수로 반올림하는 함수입니다. 결과는 원래 수보다 클 수도 있고 작을 수도 있습니다.

소수 첫째 자리가 5 이상이면 절댓값 기준으로 멀어지는 방향(반올림), 5 미만이면 가까워지는 방향으로 처리됩니다.

라이브러리: math.h

예제

#include<iostream>
#include<math.h>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.5612, number3 = -3.31132, number4 = -0.9132;
    cout<<"Values are : \n";
    cout<<"Number 1 : "<<round(number1)<<endl;
    cout<<"Number 2 : "<<round(number2)<<endl;
    cout<<"Number 3 : "<<round(number3)<<endl;
    cout<<"Number 4 : "<<round(number4)<<endl;
    return 0;
}

출력 결과

Values are :
Number 1 : 0
Number 2 : 235
Number 3 : -3
Number 4 : -1

setprecision() — 소수점 자릿수 지정

setprecision() 함수는 부동 소수점 값을 지정한 n번째 자릿수까지 정확하게 표현하여 반환합니다. 여기서 n은 setprecision() 함수에 전달되는 매개변수입니다.

소수점 이하 자릿수를 고정하여 출력하려면 fixed 조작자와 함께 사용해야 합니다.

라이브러리: iomanip

예제

#include<iostream>
#include<iomanip>
using namespace std;
int main() {
    float number1 = 0.435, number2 = 234.5612, number3 = -3.31132, number4 = -0.9132;
    cout<<"Number 1 correct upto 0 decimals "<<fixed<<setprecision(0)<<number1<<endl;
    cout<<"Number 2 correct upto 1 decimals "<<fixed<<setprecision(1)<<number2<<endl;
    cout<<"Number 3 correct upto 4 decimals "<<fixed<<setprecision(4)<<number3<<endl;
    cout<<"Number 4 correct upto 3 decimals "<<fixed<<setprecision(3)<<number4<<endl;
    return 0;
}

출력 결과

Number 1 correct upto 0 decimals 0
Number 2 correct upto 1 decimals 234.6
Number 3 correct upto 4 decimals -3.3113
Number 4 correct upto 3 decimals -0.913

마무리

C++에서 부동 소수점 숫자를 다룰 때는 목적에 맞는 함수를 선택하는 것이 중요합니다. 무조건 내림하려면 floor(), 올림하려면 ceil(), 단순 절삭에는 trunc(), 일반적인 반올림에는 round()를 사용하고, 출력 시 소수점 자릿수를 세밀하게 제어하려면 setprecision()fixed 조작자를 활용하면 됩니다. 이러한 도구들을 적절히 조합하면 부동 소수점 연산에서 발생할 수 있는 정밀도 문제를 효과적으로 관리할 수 있습니다.