부동소수점 형식과 그 연산들에 대한 이야기다.

1 ) float과 double의 차이는 무엇인가?

C++ 에는 부동소수점을 담을수 있는 타입으로 float, double, long double 을 제공한다. double 은 float의 범위를 포함하며, long double은 double의 범위를 포함한다.

수식으로는 float <= double <= long double 이 된다. 부동소수점을 컴퓨터가 표현하는 방법도 알면 도움이 될 듯 하다.

http://slame.tistory.com/2 <-- int 와 float의 차이점
http://www.winapi.co.kr/clec/cpp2/18-1-4.htm <-- 부동 소수점
http://blog.naver.com/sungback/90000637840 <-- 자료형 정리, windows 32bit, MSVC 에서만 맞다.

간단한 테스트 코드


2 ) 다음 프로그램을 실행하는데 1초가 걸린다고 하자(뭐 더 빠르겠지만..)

만일 double을 float으로 바꾼다면 실행에 어느 정도의 시간이 걸릴까? 왜 그럴까?

Dev C++ 에서 컴파일 해보았는데, 1초도 안되어서 완료가 된다. 값을 조회해 보니, .. 1e8 을 표현 한다. .... 책 내용 대로라면, float은 0 ~ 1e8 사이의 값들을 표현할 수 없기 때문에, 루프를 돌다가 x - 1 == x 가 되는 수를 만나게 되어, 무한루프를 돈다고 되어 있다.

음~

총평

이번 항목에서 말하고자 하는 점은 부동소수점 연산이나 부동소수점 자체를 정수처럼 쓰지 말라는 것이다. 왜냐하면 컴퓨터는 부동소수점 표현에 한계가 있기 때문이다. 경험상으로 컴퓨터 그래픽스 작업 중, 값들이 약간씩 이상하게 되길래 테스트 해보니, 부동소수점 값들이 오차가 누적된다는 것을 알게 되었다.

인터넷으로 여러 찾아 보니, 컴퓨터는 0.1 을 표현 할 수 없고, 많은 소수점들을 표현 할 수 없다고 알게 되었다. 일전에 "성공과 실패를 결정하는 1%의 프로그래밍 원리'에서 2진수로 10진수의 소수점을 표현하는 방법이 나오는데, 소수점은 2의 -1, -2, -3, -4 제곱으로 표현을 하며, 이를 10진수로 표현하면 각 0.5, 0.25, 0.125, 0.0625 등의 조합으로 이루어진다고 설명 되어 있다.(float, double의 비트원리를 보면 자세히 알 수 있다) 책 패이지 63쪽, ^^


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요