![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
Nibble [gameover]
2011-04-05 13:57 X
printf 함수들은 서로 내부 구동이 조금씩 다릅니다. 바이너리로 직접 비교해보심이 좋을듯 하군요.
아울러, 일관성이 없는건 좀 옥의티긴 하지만
2.000000000001 이냐 1.999999999999 냐 같은 LSB 자리올림 내림 문제들을, int로 trucation 해서 만들어낸 문제를 놓고 마치 대단한 오차가 있는것 처럼 생각하시면 안됩니다. 캐스팅이 편하긴 하지만 소수점은 그렇게 다루라고 만들어진 녀석이 아니니까요. 부동소수점은 부동소수점끼리, 정수는 정수끼리, 고정소수점은 고정소수점 끼리 연산을 하되, 변환을 해야 되는 경우엔 정밀하게 따져야 합니다. 다른 어떤 플랫폼도 이로부터 자유로울순 없어요. 미시적으로 보면, 서로 맘에 안드는게 너무나 많습니다. 미리 말씀드렸듯 알고 쓰는게 무척이나! 중요하구요. 일일이 시스템별로 테스트하는건, 한번쯤 해 볼 좋은 경험인진 모르겠지만, 생산성은 별로 없어 보이네요. 또한, 윗 글에 더해 sprintf 는 부동소수 출력을 지원하지만 wsprintf 는 지원하지 않습니다. printf 를 믿지 마세요. 정영훈님.. 테스트 하신 것 감사드리구요.
부동소수점만의 문제는 아니었으며, 부동소수점의 문제에 C++Builder만의 옵티마이즈 기능 때문에 그런 것이었습니다. 자세한 내용은, 자세한 분석을 해 주신 임프님 글을 참조해 주시기 바랍니다. http://www.borlandforum.com/impboard/impboard.dll?action=read&db=free&no=19361 자바 에서의 결과 입니다. 229.99999999999997
참고로 자바에서 1.2 * 3 하면 3.5999999999999996 이 나옵니다. C#에서는 1.2 * 3 하면 3.6으로 올바르게 나오더군요.. 소수로 계산하지 않고 정수로 계산하고 가릿수 맟춰서 소수점을 찍는듯합니다. 참고로 C/C++/Java는 값형(int, double 등)은 단순한 값형이지만.. 닷넷(C#, VB.NET)은 좀 다릅니다. 자바를 벤치마킹해서 그런지 C/C++ 에서의 구조체 변수가 닷넷에서는 경량 객체가 됩니다.(객체 취급 받는 변수로 객체의 일부 기능은 사용 불가) 즉 구조체가 메소드를 가질 수 있는데.. String 클래스처럼 자동으로 숫자를 처리하는게 있는듯 합니다. int나 double 등도 각각에 매칭되는 구조체가 있는지 점 찍으면 필드명이나 메서드가 나옵니다. 다시 해보니.. 아래 3가지의 결과에 대애 다음과 같이 나오네요..
테스트는 자바로 했습니다. (C#에서도 C++ 방식 출력을 사용 할 수 있으면 동일할 듯 합니다) System.out.printf("%f\n", 2.3 * 100); System.out.println(2.3 * 100); System.out.printf("%40.39f\n", 2.3 *100); System.out.printtln(new DecimalFormat().format(2.3 * 100)); 이 각각 230.000000 229.99999999999997 229.999999999999970000000000000000000000000 230 따로 자릿수를 지정해주지 않으면 결과가 올바르게 나오고 자릿수를 지정하는 순간 229.999999999 로 나오네요.. 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |