2016-12-25 7 views
4

이상한 문제가 있습니다. 여기 내 코드의 일부이다 :
1100 * 0.03 = 33 : temp = 정수플로어 대 int 캐스트 차이

int temp=1100; 
int foo=floor(0.03*temp); 
int foo1=0.03*temp; 
if(foo-foo1){ 
     cout<<foo<<endl; 
     cout<<foo1<<endl; 
} 

3 % 인 경우는 foo 예 1.
의해 foo1 다르다.
foo = 33
foo1 = 32. 또한
내가 그런 식으로 작성하는 경우 :

int foo=floor(0.03*1100); 
int foo1=0.03*1100; 

는 그런 문제가 없다.
왜?

+4

int 형으로 변환 floor()는 항상 반올림 (음의 무한대 방향)하는 반면, – Leon

+0

어떤 컴파일러를 사용하고 있습니까? 여기에서 재현 할 수 없습니다 : http://coliru.stacked-crooked.com/a/2df015f881f60122 – alain

+0

코드 블록 16.01 –

답변

2

부동 소수점 숫자로 소수점 이하 자릿수를 렌더링하는 데 문제가 있습니다. 근사치입니다.

2 ** - 6 + 2 ** - 7 + 2 ** - 8 + 2 ** - 9 + 2 ** - 11 + 2 ** - 13 + 2 ** - 14 + 2 ** - 15 + 2 ** - 20 + 2 ** - 22 + 2 ** - 26 = 0.0299999863

바이너리를 사용하여 정확도를 26 진수로 조정했습니다. 나는 0.03에 가깝지 만 꽤는 아니다. 내 예제에서 나는 0.03 이하로 선택했는데 조금 위에 갈 수 있었다. (즉, 0.03000001. 부동 소수점 표기법으로 완벽하게 0.03을 표현할 수 있다고 생각하지 않는다.)

임의의 수로 0.03을 곱하면 또 다른 곱셈이 생성된다. int 형으로 캐스팅하면 소수 자릿수가 모두 제거됩니다. 플로어 구현이 좀 더 우아하다고 가정합니다. 컴파일러는 부동 소수점 값을 32.99999로 선택하고 int는 32로 만듭니다.