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
[59510] Re:[질문] 나누기 연산중 생긴 문제..
nansama [] 1082 읽음    2009-12-22 10:05
조금 버그인듯 합니다.
어셈블리 소스를 살펴본 결과 nTmp2   = (int)(log(128) / log(2)); 이 줄에서는 FPU의 결과를 int형 자료로
변환할때 _ftol() 내부 함수를 사용 하는데 그 함수에서 약간 버그가 있다고 생각 됩니다.
FPU의 연산 결과는 7 이었지만 _ftol()을 거치면서 6으로 변경 되었습니다.

하지만 항상 부동소수를 사용 하실때는 정확한 값이 아니라는것을 염두 하셔야 합니다.
PC에서 부동 소수를 표현할때 지수 형태로 저장 하므로 7을 float형으로 저장 했을때
6.99999999 와 같은 값을 가지는 지수로 변환 될수 있습니다. 6.99999999 를 int로 케스팅 하면
무조건 내림 하기 때문에 6으로 표현 되는 것이죠..
PC에서 float 형의 데이타 기록방법을 공부 하신다면 이런 어처구니 없는 현상도 이해 하게 되실 겁니다.

이성진 님이 쓰신 글 :
: {
:     String  strTmp;
:     double  dbTmp;
:     int     nTmp1;
:     int     nTmp2;
:     dbTmp   = log(128) / log(2);
:     nTmp1   = (int)(dbTmp);
:     nTmp2   = (int)(log(128) / log(2));
:     strTmp.sprintf("TmpDb[%f] Tmp1[%d], Tmp2[%d]",dbTmp, nTmp1, nTmp2);
:     ShowMessage(strTmp);
: }
: 결과 "TmpDb[7.000] Tmp1[7] Tmp2[6]"
:
: 나누기 연산중 값이 Tmp1[7] Tmp2[6]가 달라지는 현상이 발생하네요..
: 같은코드를 MFC로 컴파일 했더니 Tmp1[7] Tmp2[7] 컴파일러 버그인 걸까요?
:
: xxx.ini에서 읽은 각 BIT POS를 가지고 있다 저장해도 될터인데..
: for문을 돌린다거나 해서 현재 BIT POS를 찾아내도 될터인데..
:  그래도 조금 더 간단한 방법은 없을까요 ?
:
: 일단 하는 일은
: 1. xxx.ini 에서 비트 설정을 읽어서
:   [IN]
:   START=x
:   END=x
: 2. m_maskIn구조체에 저장을 하고..
:   m_maskIn.nStart = pow(2, START_BIT_POS);
: 3. 프로그램 내부에서 m_maskIn을 사용하다 UI조작으로
:   m_maskIn의 값들을 log(m_maskIn.nStart) / log(2.0)연산으로 저장하는 구조 입니다.

+ -

관련 글 리스트
59481 [질문] 나누기 연산중 생긴 문제.. 이성진 1062 2009/12/18
59510     Re:[질문] 나누기 연산중 생긴 문제.. nansama 1082 2009/12/22
59513         Re:Re:[질문] 나누기 연산중 생긴 문제.. 이성진 1291 2009/12/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.