2016-12-25 2 views
4

私は奇妙な問題があります。ここに私のコードの一部です:フロアとintキャストの違い

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

temp =整数の3%の場合、fooは、例えば1
によってfoo1異なります
1100 * 0.03 = 33。
foo = 33
foo1 = 32。

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

そのような問題はありません:私はそのように書いた場合に加えて

なぜですか?

+4

になるだろう床 'に対し、ゼロに向けて丸め、()'は常に(負の無限大に向かって)切り捨てここでそれを再現することはできませんコンパイラを使用している – 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はint` `へのキャスト32

関連する問題