실수 연산을 하는 경우, 값들의 대소관계를 판별하기 위해 매우 작은 수인 epsilon 개념을 넣어서 >, <, == 등의 연산을 하곤 한다.
두 수의 차이의 절댓값에 대해서 epsilon보다 크냐 작냐 등의 논리가 주로 사용되는데, 여기서 주의할 점이 있다.
어떤 실수 연산을 하다가 실수 x가 0보다 작은 값(-0.000...001)이 되었고 y는 sqrt(x)의 값을 가지게 되었다고 가정하자.
여기서 y는 Indeterminate Value가 되어 -1.#IND가 된다. 이런 경우 y가 포함된 대소 비교는 모두 false의 값을 return하게 된다. 따라서 원하지 않은 결과가 나올 수 있다.
단순 연산인 경우에 이런 것을 디버깅하면서 운 좋게(?) 찾아낼 수도 있지만, 정렬 같은 경우에는 Strict weak ordering을 위반하므로 큰 문제가 발생하며 찾아내기도 힘들다.
#include <stdio.h> #include <math.h> int main() { double f = 1e-9; double x = 1e-10; x -= f; double y = sqrt(x); printf("%lf\n", y); printf("%d %d %d\n", x > y, x < y, x == y); }
'Problem Solving' 카테고리의 다른 글
제 2회 삼성 대학생 프로그래밍 경시대회 본선 후기(SCPC 2016) (0) | 2016.08.19 |
---|---|
제 2회 삼성 대학생 프로그래밍 경시대회 2차 예선 후기(SCPC 2016) (0) | 2016.07.24 |
제 2회 삼성 대학생 프로그래밍 경시대회 1차 예선 풀이(SCPC 2016) (6) | 2016.06.30 |
2016.6.18 (2) | 2016.06.18 |
Google Codejam Round 1A 2016 (0) | 2016.04.16 |
댓글