수치 계산을 하다보면 컴퓨터의 부동소수점 계산 오차때문에

a<b여야 하는것이 b<a 가 된다거나, 혹은 a==b가 되는 경우가 발생한다.
그런데 컴퓨터의 두 실수(float) a,b가
1. a<b
2. b<a
3. a==b
중에 어느것에도 속하지 않을 수 있을까?
정답은 yes 이다.
아래의 C++코드를 보자.
float a=1.0, b=sqrt(-1.0);
if(a<b || a==b || b<a ) printf("OK.");
else printf("what happen? (%g)\n",b);
문제는 b=sqrt(-1.0)에서 발생한다.
b=sqrt(-1.0) 을 할경우, 음의 루트값이기 때문에 허수값이 나오고 float형인 b에는 담을 수 없다.
그래서 b에는 -1.#IND 값이 들어가게 된다.
IND는 indeterminate의 약자로 정해지지 않았다는 말이다.
양수, 음수를 0.0으로 나누었을때 보게되는 +-1.#INF (infinite,양/음 의 무한대)와는 다르게 -1.#IND은 크기가 없다.
문제되는것은 크기가 없기 때문에 <,>,==의 모든 비교에 대해서 false를 내놓는다는 것이다.
그래서 위의 코드를 실행하면 놀랍게도 if문을 통과해서 "what happend? (-1.#IND)" 을 보게된다.
(위 코드의 실행결과)
일반적으로는 위의 예제처럼 일부러 sqrt안에 음수를 넣을일은 없겠지만,
복잡한 수치계산을 하다보면, 이론상으로는 0이 될 수 없는 수식도 수치오차때문에 -0.0001 이 될 수도 있고,
그 수식이 루트(sqrt)안에 있다면 바로 -1.#IND이 뜨면서 이후의 루틴에서 많은것을 망쳐놓으므로 조심해야한다.
하다못해 수식의 결과를 소팅 하더라도, 원소중에 하나라도 -1.#IND가 섞여있다면
혼자만 문제가 생기는게 아니라, 소팅 전체 결과가 엉망이 되어버린다.
'공부' 카테고리의 다른 글
작지도,크지도, 같지도 않다. -1.#IND (0) | 2010.12.29 |
---|---|
언어의 모호성 (0) | 2010.11.16 |
가변인수(va_arg)를 이용한 계산오차 줄이기 (3) | 2010.08.02 |
계산기하 - 원 포함 알고리즘 코딩 (0) | 2010.06.03 |
NP, NP-COMPLETE, NP-HARD (7) | 2010.05.05 |
for문에서 j (3) | 2010.04.26 |
댓글을 달아 주세요