Floor vs int 投射差异
Floor vs int cast difference
我有一个奇怪的问题。这是我的部分代码:
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
与 foo1
相差 1。
例如:
1100*0.03=33.
foo
=33
foo1
=32.
另外如果我这样写:
int foo=floor(0.03*1100);
int foo1=0.03*1100;
没有这个问题。
为什么?
浮点数无法呈现小数位。它更像是一个近似值。
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 类型将删除小数点后的所有内容。我假设 floor 的实现更优雅。您的编译器可能选择浮点值 32.99999,因此 int 会生成 32.
我有一个奇怪的问题。这是我的部分代码:
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
与 foo1
相差 1。
例如:
1100*0.03=33.foo
=33foo1
=32.
另外如果我这样写:
int foo=floor(0.03*1100);
int foo1=0.03*1100;
没有这个问题。
为什么?
浮点数无法呈现小数位。它更像是一个近似值。
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 类型将删除小数点后的所有内容。我假设 floor 的实现更优雅。您的编译器可能选择浮点值 32.99999,因此 int 会生成 32.