2

在这种情况下:

float a = 0.99999f;
int b = 1000;
int c = a + b;

结果c = 1001. 我发现它发生是因为b转换为浮点数(特定于 iOS),然后a + b没有足够的精度,1000.9999并且(为什么?)被四舍五入到更高的值。如果我们得到a-理论上正确的行为。0.999fc = 1000

所以我的问题是为什么浮点数被四舍五入到更高的值?这种行为(或约定)在哪里描述?

我在 iPhone Simulator、Apple LLVM 4.2 编译器上对此进行了测试。

4

2 回答 2

4

int c = a + b中,先将整数b转换为浮点数,然后将 2 个浮点数相加,然后将结果截断为整数。

默认的浮点舍入模式是FE_TONEAREST,表示加法的结果

0.99999f + 1000f

是可以表示为浮点数的最接近的1001f数字,即 number 。然后将此浮点数截断为整数c = 1001

如果更改舍入模式

#include <fenv.h>
fesetround(FE_DOWNWARD);

然后加法的结果向下四舍五入(大约1000.99993f),你会得到c = 1000.

于 2013-04-05T12:06:21.687 回答
1

原因是当您添加 1000 时,您会得到 8 个总小数位精度,但 IEEE 浮点数仅支持 7 位数字。

于 2013-04-05T11:55:22.490 回答