본문 바로가기
Problem Solving

Indeterminate Value

by hongjun7 2016. 4. 7.

실수 연산을 하는 경우, 값들의 대소관계를 판별하기 위해 매우 작은 수인 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);
}

댓글