본문 바로가기
코딩테스트/백준

백준 1008번 A/B : 절대오차? 상대오차?

by YUYU_ 2022. 10. 13.

예제 출력 1,2 를 보니 나눗셈의 결과가 소수 형태로 나오는 것을 볼 수 있었다. 

나는 자신있게 다음과 같이 작성했다. 

#include <iostream>
using namespace std;
int main(){
    double d1=0,d2=0;
    cin>>d1>>d2;
    cout<<d1/d2<<endl;
    return 0;
}

컴파일 결과 (입력 1,3)

 

결과는 땡!! 틀렸다. 

 

틀린 이유

절대오차, 상대오차 이 말을 신경쓰지 않고 풀어서 생긴 문제인듯하다. 

10^(-9) 는 다음과 같다.

새로 알게 된 사실 & 정답을 찾아가기 위한 과정

 

상대오차 : 10^n 까지 허용 => 실제값-10^n ~ 실제값+10^n  범위 내에서 출력해야 함.

 

위의 제출물이 틀린 이유는... 우선 소수점 자리를 fix 해주지 않고 출력했기 때문에 소수점 아래로 5자리까지만 출력이 된다. 

0.33333333233333333333333333333333~0.3333333343333333333333333333333 사이 내에서 출력해야 하는데  지금 작성한 코드이 출력값이 0.33333이다.  범위를 벗어난다. 

 

다음과 같이  범위를 벗어났는지 확인 하는 방법도 있다. 

내가 작성했던 오답의 결과값과 정답의 값의 차는 다음과 같다. 

0.000003333.... 정도의 차이가 있다.  오차(10^(-9) 인 0.000000001) 보다 크다.  따라서 오답이다. 

 

대충 0.333333332 ~ 0.333333334  사이를 출력하면 된다는 뜻이니까 

0.333333333 or 0.3333333333, 0.33333333333333333 ..... 을 출력했을 때 다 정답이 될 것이다. 

즉,

소수점 자리 수가 최소 9자리가 되게 출력하면 정답이 되는 것이다. 

 

+ float, double long double 중 어떤 자료형을 택해야 하는가? 

자릿수는 다음과 같다. 

float은 유효 자릿수가 7이기 때문에 float을 이용하면 소수점 아래로 7자리까지만  출력이 가능하므로 부적절하다. double 이나 long double을 써야겠다. 

정답

나는 답을 작성할 때 소수점 출력 자리 수를 10자리로 제한하고 출력했더니 통과했다. 

 

** 소수점 출력 : cout.precision(자리수);

** c

 

 

*틀린 내용이 있다면 언제든지 지적 부탁드립니다! *