'2010/12'에 해당되는 글 1건

  1. 2010.12.29 작지도,크지도, 같지도 않다. -1.#IND
수치 계산을 하다보면 컴퓨터의 부동소수점 계산 오차때문에

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
Posted by youknow04


티스토리 툴바