在这种情况下:
float a = 0.99999f;
int b = 1000;
int c = a + b;
结果c = 1001
。我发现它发生的原因是b
转换为浮动(特定于iOS),然后a + b
没有足够的精度1000.9999
和(为什么? )四舍五入到更高的价值。如果a
为0.999f
,我们会得到c = 1000
- 理论上正确的行为。
所以我的问题是为什么浮动数字四舍五入到更高的值?描述这种行为(或惯例)的地方?
我在iPhone模拟器,Apple LLVM 4.2编译器上进行了测试。
答案 0 :(得分:4)
在int c = a + b
中,整数b
首先转换为浮点数,然后转换为2浮点数
添加数字,结果被截断为整数。
默认浮点舍入模式为FE_TONEAREST
,表示结果
添加
0.99999f + 1000f
是 最近的 号码,可以表示为浮点数,即数字1001f
。然后将此浮点数截断为整数c = 1001
。
如果更改舍入模式
#include <fenv.h>
fesetround(FE_DOWNWARD);
然后添加的结果向下舍入(大约1000.99993f
),您将获得c = 1000
。
答案 1 :(得分:1)
原因是当您添加1000时,您将获得8个精确的十进制数字,但IEEE float仅支持7位数。