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
[58613] 정말 감사합니다. 속이 후련하네요 ㅎㅎ (내용없음)
김동욱 [kimehddnr] 1207 읽음    2009-09-23 11:16
김민호.소중한꿈 님이 쓰신 글 :
: 테스트를 해보니까 3.56 - 3.555 식의 결과값이 0.0049999... 형태로 나오네요.
: 확신할 순 없지만 round-off 와 관련한 문제라고 봅니다. 그래서 각각의 상수에 'L' (또는 'ㅣ') 을 붙여서 계산하니까 값이 제대로 나오네요.
:
: 아마도, 3.56 - 3.555 라고 하면 내부적으로 float 형으로 계산이 되는데, 이 계산에서 float 형의 유효숫자 범위를 벗어나는 것같습니다. 일단 에러가 여기서 생기니까 이후에 double 로 변환해줘봐야 소용없습니다.
:
: 그래서 3.56 - 3.555 계산을 처음부터 double 정밀도로 해주기 위해서 'L' 을 붙이니까 원하는 결과가 나오네요.
:
:
: // 계산 결과가 바른 경우
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: 	double a = 2.802, b = 2.803, c = 3.56L - 3.555L, d = c / 0.01;
: 	double result = RoundTo((a + b) * d, -3);
: 	Edit1->Text = FloatToStr(a);
: 	Edit2->Text = FloatToStr(b);
: 	Edit3->Text = FloatToStr(c);
: 	Edit4->Text = FloatToStr(d);
: 	Edit5->Text = FloatToStr(result);
: }
: // 계산 결과가 잘못된 경우
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
: 	double a = 2.802, b = 2.803, c = 3.56 - 3.555, d = c / 0.01;
: 	double result = RoundTo((a + b) * d, -3);
: 	Edit1->Text = FloatToStr(a);
: 	Edit2->Text = FloatToStr(b);
: 	Edit3->Text = FloatToStr(c);
: 	Edit4->Text = FloatToStr(d);
: 	Edit5->Text = FloatToStr(result);
: }
: 

:
:
: 김동욱 님이 쓰신 글 :
: : 답변 감사합니다.
: :
: : 어느정도 원인을 찾은것 같은데 어떻게 해결해야할지 ㅠㅠ
: :
: : double a = 2.802, b = 2.803, c = (3.56 - 3.555) / 0.01;
: : double temp = RoundTo((a + b) * c, -3);
: : Edit1->Text = FloatToStr(temp);
: :
: : c 부분을 계산하면서 디버그시에는 0.5로 보이는데 실제값은 0.5가 되지 못하나보네요.
: :
: : 좀 황당하기도 하구 ㅠㅠ
: :
: : 김민호.소중한꿈 님이 쓰신 글 :
: : :
: : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : {
: : : 	double temp = RoundTo((2.802 + 2.803) * 0.5, -3);
: : : 	Edit1->Text = FloatToStr(temp);
: : : }
: : : 

: : :
: : : 이런식으로 테스트 해봤는데, 2.803 으로 값이 제대로 나오던데요?
: : : 왜 결과가 다르게 나왔는지 알 수 있도록 해당 부분의 소스를 좀 볼 수 있을까요?
: : :
: : : 김동욱 님이 쓰신 글 :
: : : : RoundTo 나 SimpleRoundTo, FormatFloat 모두 사용해도 반올림이 되지 않네요.
: : : :
: : : : 당연히 되야되는거 같은데 디버깅 모드에서 반올림 전까지는 값이 제대로 들어가는데 결과는 반올림이 않되네요.
: : : :
: : : : double 형으로 연산하고 계산식은 (2.802 + 2.803) * 0.5 인데 소수3자리에서 반올림하면 2.802로 나타납니다.
: : : :
: : : : 이거 가지고 몇시간이나 해메고 있네요. 혹시 옵션을 조정하면 되지 않을까 해서 이것 저것 건드려 보고 있는데
: : : :
: : : : 시간만 가네요. ㅜㅜ

+ -

관련 글 리스트
58602 반올림이 잘 않되네요 ㅠㅠ 김동욱 1101 2009/09/22
58603     Re:반올림이 잘 않되네요 ㅠㅠ 김민호.소중한꿈 1349 2009/09/22
58610         Re:Re:반올림이 잘 않되네요 ㅠㅠ 김동욱 1545 2009/09/23
58612             Re:Re:Re:소 뒷걸음치다 쥐잡은 결과 김민호.소중한꿈 1592 2009/09/23
58613                 정말 감사합니다. 속이 후련하네요 ㅎㅎ (내용없음) 김동욱 1207 2009/09/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.