float에서 곱셈...
글쓴이: andrea0705 / 작성시간: 목, 2003/04/24 - 2:33오후
main()
{
float aaa, bbb;
aaa = 0.817 * 100;
printf( " aaa[%f]...\n", aaa);
}
실행시켜보면 aaa= 81.7 이 나와야 하는데,
실제로 81.699997 이 나옵니다.
물론, printf( " aaa[%.5f]...\n", aaa); 로 하면 제대로 나오는데
aaa라는 변수에 넣을 수가 없어요..
방법을 가르쳐 주세요..
Forums:
double을 사용하세요
float의 곱셈은 double이 아니던가요?
C를 했던지가 오래되서..
아래처럼 하면 제대로 나오는거같긴한데요...
main()
{
float bbb;
double aaa;
aaa = 0.817 * 100.0;
printf( " aaa[%f]...\n", aaa);
}
정상동작이지요
컴은 10진 연산이 아닌 2진 연산을 하므로 그런 증상은 정상-.- 이지요
즉 2진수로 10진수 0.817을 표현해서 저장하고 그것에 100을 곱하는건데..
0.817을 2진수로 표현하면 가장 비슷하게 표현되봤자
0.816999971866607666 정도...
즉 애시당초 0.817은 표현이 안되고 어느정도쯤에서 반올림을 해야겠지요...
CPU의 특성과 관계 있습니다.
FPU에서 사용하는 실수(부동소수점 실수)는 2진수의 실수형입니다.
(정확히 말하자면 1.???????.... X 2^n 형태로 저장되어 있죠.)
따라서 우리가 사용하는 10진수를 2진수로 변환하는 과정에서 그리고
연산 후 2진수를 다시 10진수로 변환하는 과정에서 그런 일이 생기죠.
마치 1/3이라는 분수를 0.33333333.... 으로 바꿀 때 나타나는 자리
잘림 현상 때문이라고나 할까.
참고로 지금 컴파일러들은 float, double형 연산시에는 대부분 FPU를
사용하도록 합니다.
Written By the Black Knight of Destruction
댓글 달기