2015년 9월 25일 금요일

asin(double) 함수 사용 주의! 간단한 나눗셈도 정말 주의! 컴퓨터 만든 사람들이 싫다.

문제를 내 보자... 컴퓨터로, 성능 좋은 32bit/64bit PC 용으로, 수학 함수 하나를 계산해 보자.

제목에 있는 asin 함수이다. 수학에서 arcsine (아크사인)함수라고 하는 정말 유명한
삼각함수인 sine 함수(sin) 의 역함수이다.

#include <math.h>
...
double asin_result = asin( 1.44 / 2.0 / 0.72 );

...

자, 이제 정답은?  너무 쉽다고?
웬만한 중학생이라도 암산으로 풀 수 있는 문제를 왜 여기에 올렸냐고?

해 봐라... 컴퓨터로... 좋은 컴퓨터를 사용하시라...

1.44 / 2.0 / 0.72
를 먼저 계산해야 하겠지....

이 값이 1 이라고 하는 사람 있겠지?

컴퓨터는 이 계산을 뭐라고 할까? 1 ? 아니다. 비슷하지만, 절대로 아니었다.
정답은?
컴퓨터의 계산:
1.44 / 2.0 / 0.72 == 1.0000000000000380
웃긴다고? 이게 현실이다. 이 글을 읽는 사람들은 웃고 있을 수 있지만,
이 글을 쓰고 있는 글쓴이는 자신이 심혈을 기울여 만든 산업용 소프트웨어에서 벌어진 황당한 정보 처리 결과에 아주 큰 금전적, 기술적 신뢰의 타격을 받고 있다. 밤새서 찾아도
30시간 정도 걸려서 겨우 찾아냈다.
그리고, 뭐 아주 작은 차이니까 무시할 수 있지 않냐고?
그래, 1.0과  1.0000000000000380 은 정말 작은 차이이다.

그러나, 이 다음 단계부터 파탄은 시작된다.

asin( asin_arg = 1.0000000000000380 ) == asin_result == -1.#IND000000000000

이런, 이게 도대체 무슨 숫자냐? 나름 이공계를 공부/전공한다는 사람도
이런 숫자를 처음 보는 사람도 있을 것이다.

-1.#IND000000000000

컴퓨터가 이런 값을 계산할 수나 있는 것일까?
무슨 의미인가?

이후는... 컴퓨터 프로그래밍 언어의 설명서를 아주 열심히 찾아 보시기 바란다.
이런 파탄을 당하지 않기 위해서 열심히 살기를 바란다.

_

댓글 없음:

댓글 쓰기