[Baekjoon/백준][1008][C/C++] A/B
『목차』
0. 개요
1. 문제
2. 풀이
3. 코드
0. 개요
다시 돌아온 기초 문제 풀이시간. 다만, 이번 문제는 단순 나누기 문제가 아닌 '실수 자료형'과 '부동소수점'에 대한 이해를 바탕으로 하는 문제이다. 표현이 어려워 보여도, 실수에 대한 디테일한 이해까지 요구하는 문제는 아니라서, 기본적인 개념만 잡혀있다면 충분히 쉽게 풀 수 있다. (사실 얼마전까지 컴활1급 공부한다고 VBA문법만 공부하다가, 다시 C언어로 넘어오니 문법이 헷갈린다.😂)
1. 문제
1008번: A/B
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
[문제]
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
[입력]
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
[출력]
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.
[예제 입력 1]
1 3
[예제 출력 1]
0.33333333333333333333333333333333
10-9 이하의 오차를 허용한다는 말은 꼭 소수 9번째 자리까지만 출력하라는 뜻이 아니다.
[예제 입력 2]
4 5
[예제 출력 2]
0.8
2. 풀이
이 문제를 풀기 위해 알고 있어야 할 2가지 개념이 존재한다.
1. 실수 자료형은 오차가 발생한다.(부동 소수점 방식)
2. C/C++에서 각 자료형에 따른 소수점 이하 정밀도가 어떻게 되는가?
[1. 실수 자료형은 오차가 발생한다. (부동 소수점 방식)]
실수 자료형에 오차가 발생하는 이유는, 정수와는 다른 실수의 표현방식 때문이다.
이에 대한 원론적인 이야기는 다른 포스팅에 다룰 예정이기에, 우선은 다른 분의 글을 참고하자.
https://ahnjg.tistory.com/m/16
컴퓨터에서 실수의 표현 (Fixed Point, Floating Point, Single Precision, Double Precision)
컴퓨터가 수를 표현하는 방식 사람들은 일반적으로 0~9의 조합을 가진 10진수를 사용하여 소통합니다. 하지만 컴퓨터는 0과 1의 조합으로 이루어진 비트만을 저장하고 연산할 수 있습니다. 따라
ahnjg.tistory.com
위 글을 읽었다면, 부동 소수점 방식으로 실수를 표현할때 오차가 발생하는 이유를 알게 될 것이다.
[2. C/C++에서 각 자료형에 따른 소수점 이하 정밀도가 어떻게 되는가?]
그렇다면 float, double, long double 자료형에 따른 소수점 이하 정밀도가 어떻게 될까?
'열혈C'에서는 소수점 이하 정밀도를 다음과 같이 표기한다.
float | 6자리 |
double | 15자리 |
long double | 18자리 |
따라서, 위 문제의 경우 절대오차 또는 상대오차가 $10^{-9}$이어야 하므로 double 혹은 long double의 자료형을 사용해야 한다.
추가적으로, 소수점 이하 9자리까지의 상대 오차가 인정되므로 printf를 통한 서식 표기 시, 서식문자가 소수점 9자리 이상을 나타낼 수 있게 표기하여야 한다. '%.9f', '%.10f ', '%.11f', ... 은 가능하지만, '%.8f', '%.7f', '%.6f', ... 의 경우 오답 처리된다.
<3줄요약>
1. double 자료형 이용. (long double은 가능, float은 불가능)
2. 서식문자 %.9f 사용. (소수점 9자리 이상만 표기 가능하면 된다.)
3. 나눗셈 진행 시 (double)을 표기하여 명시적 형변환을 진행하자. (이거 안 하면 바보...)
3. 코드
#pragma warning(disable:4996) //visual studio scanf 오류 방지.
#include <stdio.h>
int main(int argc, char* argv[]) {
int a = 0, b = 0;
scanf("%d %d", &a,&b);
printf("%.9f", (double)a/b); //double 자료형으로 명시적 형변환 진행.
return 0;
}