C++

[C++] 부동 소수점 숫자의 정밀도(Precision)

kugnuoy 2024. 1. 16. 12:50

1. setprecision()

부동 소수점 숫자를 출력할 때 std::cout의 기본 정밀도는 6이다.

 

그러나 <iomanip> 헤더파일에 정의된 std::setprecision() 함수를 사용해서 cout에서 출력되는 기본 정밀도를 재정의할 수 있다. 아래 코드는 정밀도를 16자리로 설정하는 코드이다.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << setprecision(16);
    
	float f = 3.33333333333333333333f;
	cout << f << endl;
    	
	double d = 3.33333333333333333333f;
	cout << d << endl;
     
	return 0;
}

두 경우 모두

3.333333333333333 로 16자리가 나와야 할 것 같지만 그렇지 않다.

부동 소수점 자료형의 변수가 가지는 정밀도는 자릿수 크기와 저장되는 특정 값에 따라 달라지기 때문이다.

float 이 가지는 정밀도가  6~9, double 이 가지는 정밀도가 15 ~ 18 로 정밀도 문제에 영향을 미친다.

위의 출력값은 다음과 같았다.

3.333333253860474 (7자리까지 정확히 출력, float)
3.333333333333334 (15자리까지 정확히 출력, double)

 

따라서 변수가 보유할 수 있는 것보다 더 정밀도가 필요한 부동 소수점 숫자를 표현할 때 주의해야 한다.

2. fixed

setprecision(5)를 사용할 때, 소수점 4자리 이하의 숫자를 출력하면 해당 자릿수까지만 출력한다.

예를 들어,

float a {3.14}
cout << setprecision(5) << a;

의 출력 결과는 3.14 이다.

그러나 만약 고정적으로 소수점 5자리를 출력하고 싶다면

float a {3.14}
cout << setprecision(5) << fixed << a;

fixed 를 사용하면 출력 결과는 3.14000 이다.