알광(Algwang) 2018. 12. 30. 20:34

문제링크 : https://www.acmicpc.net/problem/1008


간단한 문제지만 확실히 알아야하는 문제이다. Codeforces 라운드에서 많이 틀렸던 유형이기도 하다.


정수형의 수들은 알고리즘 문제를 해결하며 많이 다뤄보지만 소수점은 많이 다뤄보지 않는다. 그래서 확실하게 알아놓지 않으면 갑작스럽게 문제가 생겼을 때 당황하기 쉽다.


먼저, 오답이다.



- 소스 코드(오답) -


#include<iostream>
using namespace std;
int main(void) {
float a, b;
cin >> a >> b;
float c = a / b;
printf("%.9f", c);
}




소수점을 계산하기 위해 float으로 입력을 받았다. 그리고 10^-9 이하의 오차만 허용하므로 .9f를 사용해 아홉번 째 자리까지 출력하였다.

이제 결과를 보자.




?!


예상하지도 못한 4가 나왔다. 이러한 현상이 왜 발생하는가?


컴퓨터에서 10진수를 2진수로 바꾸면서 발생한 구조적인 문제이다.


이런 오차없이 실수를 사용하고 싶다면


float의 가수는 6~7자리


double의 가수는 15~16자리라는 것을 기억하자.


즉, 이 문제는 double을 이용해서 해결해야 한다.


자세한 설명은 아래 링크의 블로그를 확인하면 된다.


http://karmainearth.tistory.com/143


- 소스코드 -

#include<iostream>
using namespace std;
int main(void) {
double a, b;
scanf("%lf %lf", &a, &b);
printf("%.9lf", a/b);
}