절대 오차와 상대 오차가 뭘까?

정혜연·2023년 10월 17일
post-thumbnail

궁금증이 생긴 건 백준 1008번, 사칙연산 알고리즘의 나누기 문제에서였다. ▶ 문제 링크

허용되는 오차범위에 제한이 있는데, 절대오차와 상대오차라는 게 뭘까?

절대오차(Absolute errors)

절대오차란 실제의 값과 측정한 값의 오차이다.
예를 들어 내 키의 실제 길이는 155cm인데, 측정했을 때 152cm로 나왔을 경우의 절대오차는 155(cm)-153(cm), 즉 2(cm)이다.

상대오차(Relative Error)

상대오차는 절대오차를 실제의 값으로 나눈 값이다. 백분율이나 천분율로도 표현한다.
2(cm)/155(cm) = 0.0129032258064516
여기에 100을 곱해 백분율(%)로 바꾸면 1.2%의 상대오차가 발생하게 되는 것이다.

아하! 이런 의미였구나.

개념은 이해했지만, 문제가 원하는 값의 조건은 절대오차나 상대오차가 10⁻⁹(0.000000001) 보다 작아야 했다.
여기서 함정! float은 4바이트로 오차범위를 10⁻⁹까지 줄일 수 없다. 10⁻⁷까지는 된다. 소숫점 7번째 자리까지다.
그러나 double은 8바이트로 오차범위가 10⁻¹⁵까지 가능하다. 그렇기에 자료형으로 double을 사용해야 한다.

그렇게 나온 풀이는...

import java.util.*;

public class Main {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);

		double A = sc.nextDouble();
		double B = sc.nextDouble();
		
		double C = A/B;
		
		System.out.println(C);		
    }
}

코드 자체는 간단하게 풀이될지도 모르겠지만... 문제를 잘못 해석하지 않기 위해 이해해야 하는 부분들이 있었고, 모르는 개념들을 알게 되어서 좋았다.

덧붙여 이 문구 때문에 String.format("%.9f", C)로 처리하려 했는데, 유심히 읽어보니 억지로 소숫점 9번째 자리에서 절삭하거나 강제로 늘리는 건 아니어 보여서 패스했다.
이렇게 처리해도 정답은 되었지만....

풀이 후 QNA를 찾아본 결과, 출력되는 부분만 인지해 채점하기 때문이라고 한다.

profile
자바 공부중

0개의 댓글