성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>double 값을 구할 때는 반드시 피연산자를 double로 형변환!</h1> <p> C++로 먼저 알아볼까요? ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>double</span> t = <span style='color: blue; font-weight: bold'>1.0f</span> / 3; printf("%0.15Lf\n", t); </pre> <br /> float 32비트 단정도 실수를 정수형 변수로 나누고 그 결과는 double에 담기기 때문에 왠지 배정도 실수로 연산이 될 듯하지만... 의외로 결과는 "0.333333343267441"로 나옵니다. 짐작할 수 있겠지만, 다음과 같이 (double)로 식을 강제로 형 변환해도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t2 = <span style='color: blue; font-weight: bold'>(double)</span>(1.0f / 3); printf("%0.15Lf\n", t2); </pre> <br /> 역시나 결과는 "0.333333343267441"로 나옵니다. <br /> <br /> 정확히 하려면, 피연산자 중 하나는 반드시 double로 처리해야 합니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t3 = <span style='color: blue; font-weight: bold'>1.0L</span> / 3; // 1.0을 명시적으로 double literal로 처리. printf("%0.15Lf\n", t3); // 출력 결과: 0.333333333333333 </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t4 = 1.0f / <span style='color: blue; font-weight: bold'>(double)3</span>; // 3을 명시적으로 double로 형변환 printf("%0.15Lf\n", t4); // 출력 결과: 0.333333333333333 </pre> <br /> 아니면, 그냥 1.0이라고만 하면 C++ 컴파일러가 실수형 상수에 대해 기본적으로 double로 처리하기 때문에 정확한 결과가 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t5 = <span style='color: blue; font-weight: bold'>1.0</span> / 3; printf("%0.15Lf\n", t5); // 출력 결과: 0.333333333333333 </pre> <br /> <hr style='width: 50%' /><br /> <br /> 이것은 C#에서도 동일하게 적용됩니다. 피연산자 중에 double 형이 없다면 다음과 같이 단정도 실수의 정확성만 갖게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>double t</span> = 1.0F / 3; Console.WriteLine(t); // 0.333333343267441 double t2 = <span style='color: blue; font-weight: bold'>(double)</span>(1.0F / 3); Console.WriteLine(t2); // 0.333333343267441 </pre> <br /> 정확한 결과를 내려면 피연산자 중 적어도 하나는 double 형이거나,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t3 = <span style='color: blue; font-weight: bold'>1.0d</span> / 3; Console.WriteLine(t3); // 0.333333333333333 double t4 = 1.0F / <span style='color: blue; font-weight: bold'>(double)3</span>; Console.WriteLine(t4); // 0.333333333333333 </pre> <br /> C++에서와 마찬가지로 그냥 C# 컴파일러가 알아서 1.0을 double로 처리하도록 두면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double t5 = <span style='color: blue; font-weight: bold'>1.0</span> / 3; Console.WriteLine(t5); // 0.333333333333333 </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4712
(왼쪽의 숫자를 입력해야 합니다.)