알고리즘 문제풀이/C++

[백준/C++] 1008번: A/B - float와 double의 차이 (정밀도)

aerimi-code 2026. 1. 28. 15:17

1. 문제 정보

  • 문제 번호: 1008번
  • 문제 이름: A/B
  • 사용 언어: C++
  • 문제 링크: 백준 1008번 바로가기
  • 문제 요약:단, 실제 정답과 출력값의 절대오차 또는 상대오차가 10^{-9} 이하이어야 한다.
  • 두 정수 A와 B를 입력받아 A/B를 출력하는 프로그램을 작성하시오.

 

 

2. 접근 방법 (알고리즘)

이 문제는 단순히 나눗셈을 하는 것이 아니라, "얼마나 정밀하게 소수점을 표현할 수 있는가?"를 묻는 문제다.

문제 조건에 오차 범위가 적혀있다. 즉, 소수점 아래 9자리 이상 정확하게 출력해야 한다는 뜻이다.

하지만 C++의 cout은 기본적으로 소수점 6자리까지만 출력하므로, fixed나 setprecision을 사용해 출력 자릿수를 늘려줘야 한다. 더 중요한 것은 변수의 자료형(Data Type) 선택이다.

 

 

3. 코드 구현 (C++)

 

#include <iostream>
#include <iomanip> // setprecision을 쓰기 위해 필요
using namespace std;

int main() {
    // float가 아닌 double을 사용해야 함
    double a, b; 
    cin >> a >> b;

    // 소수점 유효 자리를 넉넉하게 10자리 이상으로 설정
    cout << setprecision(10) << a / b;

    return 0;
}




4. 배운 점 & 회고 (TIL)

처음에는 습관적으로 float를 썼다가 틀렸다. 찾아보니 부동 소수점(Floating Point) 자료형의 정밀도 차이 때문이었다.

A. 틀린 이유: float vs double

  • float (단정도 부동 소수점): 4바이트(32bit). 유효 자릿수가 약 7자리밖에 안 된다. 문제에서 요구하는 오차 범위를 만족하기엔 정밀도가 부족하다.
  • double (배정도 부동 소수점): 8바이트(64bit). 유효 자릿수가 약 15자리다. 알고리즘 문제 풀이에서는 웬만하면 double을 써야 한다.

B. 출력 조작: setprecision

C++에서 단순히 cout << a/b;를 하면 적당히 반올림되어 출력된다.

  • #include <iomanip> 헤더를 추가해야 한다.
  • cout << setprecision(10): 전체 유효 숫자를 10자리로 맞춘다는 의미다. (또는 fixed와 함께 써서 소수점 아래 자리를 고정할 수도 있다.)

결론

"알고리즘 문제에서 실수(소수)를 다룰 때는 고민하지 말고 무조건 double을 쓰자."

 

 

추가 팁!  long double도 존재한다.