음...
이런 질문이 가끔씩 올라오는데요.
프로그램 언어에서 자료형에 따라 표현할수 있는 수에 제한이 있습니다.
char = -128 ~ 127
unsigned char = 0 ~ 255
short = -32768 ~ 32767
unsigned short = 65535
int = -2147483648 ~ 2147483647
INT64 ...
그런데 위는 모두 정수형입니다.
그런데 실수의 관점에서 볼때
0 과 1 사이에 실수의 갯수는 몇개가 될까요?
답은 무한대 입니다.
실수는 아무리 작은 실수라도 같지 않는 두 실수의 사이의 실수의 갯수는 무한대 인거죠
유한한 pc자원으로 무한의 실수를 모두 unique하게 표현할 자료형은 존재할수가 없습니다.
pc가 아니라 그 무엇으로도...
그래서 컴퓨터에서는 오차를 감안하고 실수를 표현하고 있습니다.
고정소숫점 또는 부정소숫점 두가지 방법이 있는데요..
가령 예를 들어
0.0123 = 123 x 1/10000 = 123 x 10^(-4) 이 되구
12300 = 123 x 100 = 123 x 10^(2) 이 됩니다.
이 와같이 실수는 정수와 승수로 나누어 표현할수 있습니다.
float형은 4byte 이구 double 형은 8byte이기 때문에 double형이 정확도가 좀 높을뿐이죠
만약 0.01234567000000000000000000000000000000534 이런 숫자가 이으면 어떻게 표현할까요?
1234567000000000000000000000000000000534 x 10(-31) 이런 식으로 표현할까요?
앞에 정수 부분도 너무 크기 때문에 이런 경우에는 그냥 1234567 x 10(-8) 뭐 이런 식이 될것입니다.
일정 부분을 포기하는 게죠
"고정수숫점"은 소숫점이 고정되어있다는 뜻이구
"부동소숫점"은 소숫점이 부(浮-떠다닐부) 동(動-움직일동) 즉 소숫점이 움직인다는 뜻이겠죠
구체적으로 어떻게 소숫점이 표현되는지
CPU에서는 소숫점 연산을 어떻게 하는지 아래 링크들을 통해 확인해 보세요
@ 위키 IEEE 754
http://en.wikipedia.org/wiki/IEEE_754
http://ko.wikipedia.org/wiki/IEEE_754 - 한글
@ FPU (floating point unit) ; 부동소수점 처리장치
http://www.terms.co.kr/FPU.htm
@ 2.1 부동소수점 비법들: IEEE 부동소수점을 통한 성능 향상
http://www.gpgstudy.com/gpg2/gpg2s2-1draft.html
@ IEEE 부동소수점 표현
http://blog.daum.net/jty71/9724020
@ 부동 소숫점 연산
http://blog.naver.com/leojesus?Redirect=Log&logNo=80045980042
@ IEEE 754 - 부동소수점 표기법
http://blog.naver.com/wizhyo/100001523443
@ IEEE* Floating-point Exceptions
http://parallel.ru/docs/Intel/f_ug/ieee_ovw.htm
그럼...
오랜만 님이 쓰신 글 :
: double a = 25.34, b = 0.1, c = 0.0, d = 0.0;
:
: for(int i = 0; i < 200; i++) {
: c = a - d;
: d += b;
: Memo1->Lines->Add(c);
: }
:
: 위 프로그램을 실행시키면 메모장에 25.34 에서 0.1 씩 빼준 값이 나오다가 어느순간부터 값이 이상하네요...
: 또 double이 아닌 float 로 값을 선언하면 처음부터 0.1 씩 빼준값이 아닌 거의 근사값이 나옵니다.
: 왜 그런가요...
:
: Memo1
: 25.34
: 25.24
: 25.14
: 25.04
: 24.94
: 24.84
: 24.74
: 24.64
: 24.54
: 24.44
: 24.34
: 24.24
: 24.14
: 24.04
: 23.94
: 23.84
: 23.74
: 23.64
: 23.54
: 23.44
: 23.34
: 23.24
: 23.14
: 23.04
: 22.94
: 22.84
: 22.74
: 22.64
: 22.54
: 22.44
: 22.34
: 22.24
: 22.14
: 22.04
: 21.94
: 21.84
: 21.74
: 21.64
: 21.54
: 21.44
: 21.34
: 21.24
: 21.14
: 21.04
: 20.94
: 20.84
: 20.74
: 20.64
: 20.54
: 20.44
: 20.34
: 20.24
: 20.14
: 20.04
: 19.94
: 19.84
: 19.74
: 19.64
: 19.54
: 19.44
: 19.34
: 19.24
: 19.14
: 19.04
: 18.94
: 18.84
: 18.74
: 18.64
: 18.54
: 18.44
: 18.34
: 18.24
: 18.14
: 18.04
: 17.94
: 17.84
: 17.74
: 17.64
: 17.54
: 17.44
: 17.34
: 17.24
: 17.14
: 17.04
: 16.94
: 16.84
: 16.74
: 16.64
: 16.54
: 16.44
: 16.34
: 16.24
: 16.14
: 16.04
: 15.94
: 15.84
: 15.74
: 15.64
: 15.54
: 15.44
: 15.34
: 15.24
: 15.14
: 15.04
: 14.94
: 14.84
: 14.74
: 14.64
: 14.54
: 14.44
: 14.34
: 14.24
: 14.14
: 14.04
: 13.94
: 13.84
: 13.74
: 13.64
: 13.54
: 13.44
: 13.34
: 13.24
: 13.14
: 13.04
: 12.94
: 12.84
: 12.74
: 12.64
: 12.54
: 12.44
: 12.34
: 12.24
: 12.14
: 12.04
: 11.94
: 11.84
: 11.74
: 11.64
: 11.54
: 11.44
: 11.34
: 11.24
: 11.14
: 11.04
: 10.94
: 10.84
: 10.74
: 10.64
: 10.54
: 10.44
: 10.34
: 10.24
: 10.14
: 10.04
: 9.94000000000004
: 9.84000000000004
: 9.74000000000004
: 9.64000000000004
: 9.54000000000004
: 9.44000000000004
: 9.34000000000004
: 9.24000000000004
: 9.14000000000004
: 9.04000000000004
: 8.94000000000004
: 8.84000000000004
: 8.74000000000003
: 8.64000000000003
: 8.54000000000003
: 8.44000000000003
: 8.34000000000003
: 8.24000000000003
: 8.14000000000003
: 8.04000000000002
: 7.94000000000002
: 7.84000000000002
: 7.74000000000002
: 7.64000000000002
: 7.54000000000002
: 7.44000000000002
: 7.34000000000001
: 7.24000000000001
: 7.14000000000001
: 7.04000000000001
: 6.94000000000001
: 6.84000000000001
: 6.74000000000001
: 6.64
: 6.54
: 6.44
: 6.34
: 6.24
: 6.14
: 6.04
: 5.93999999999999
: 5.83999999999999
: 5.73999999999999
: 5.63999999999999
: 5.53999999999999
: 5.43999999999999