todory2002   4년 전

14919번 문제를 풀다가 생긴 질문입니다.

section배열에 0,L,2L,3L...,(m-1)L,1 이렇게 넣어준 뒤에 double형 input 변수에 차례로 입력받아 upper_bound를 사용해 input 변수 값의 section배열 내 위치를 찾아내어 갯수를 더해주는 방식으로 코딩해 봤습니다.

제 의도대로면 0.2를 넣어줬을 때, 0.4의 위치가 반환되는게 정상이고, 실제로 잘 작동되는 듯 합니다.

문제는 이와 같이 코딩한 뒤 첫 번째 예제를 넣어보면 0.6을 넣어줬을 때만 0.6의 위치를 반환하게 됩니다. 혹시나 싶어 m=625로 주고 0.0016 0.0032 0.0048 등의 실수를 넣어주니 0.0048, 0.0096 등의 실수들만 부정확한 인덱스를 도출하더군요.

지금까지 살펴본 바로는 6의 배수들만 문제가 생기고 있는데, 혹시 부동소수점 관련해서 제가 모르는 게 있어서 감이 안잡히나 싶어서 질문드립니다.

bupjae   4년 전

double 로는 정확한 실수를 표현할 수 없습니다.

예를들어 대부분의 구현체에서 0.1 + 0.1 + 0.1 == 0.3 은 false 가 되어버립니다.

그래서 보통 두 실수가 같은지 비교할 때는 a == b 보다 abs(a-b) < 1e-9 와 같은 방법을 사용합니다.

  

하지만, 이 문제의 경우 (예를들어) b_4 및 b_5 의 경계선에 매우 가까운 입력이 주어지도라도 b_4 그룹에 속하는지 b_5 그룹에 속하는지 오차없이 판별해야 하며

double 형으로는 사실상 불가능하다고 봅니다.   

todory2002   4년 전

@bupjae 아 문제 접근방식이 좋지 못했군요.. 답변 감사합니다.

댓글을 작성하려면 로그인해야 합니다.