C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[58192] Re:어떤수에서 값을 규칙적으로 빼는데... 값이 안 맞네요.
장성호 [nasilso] 1211 읽음    2009-08-26 00:57
음...
이런 질문이 가끔씩 올라오는데요.

프로그램 언어에서 자료형에 따라 표현할수 있는 수에 제한이 있습니다.

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

+ -

관련 글 리스트
58188 어떤수에서 값을 규칙적으로 빼는데... 값이 안 맞네요. 오랜만 875 2009/08/25
58192     Re:어떤수에서 값을 규칙적으로 빼는데... 값이 안 맞네요. 장성호 1211 2009/08/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.