加入0.1,你确实添加稍低于0.1的值。
所以加入0.1 5次与添加0.5次不一样;你没有完全达到那个值。再次加入.5,你不会超过11,这会产生你观察到的行为。
AC程序,如
#include <stdio.h>
#include <math.h>
int main()
{
double a = 10.0;
int i;
for (i = 0; i < 11; i++) {
printf("%4.19f\t%4.19f\t%4.19f\n", a, a+.5, floor(a + 0.5));
a += 0.1;
}
printf("\n");
for (i = 0; i < 11; i++) {
a = 10.0 + i/10.0;
printf("%4.19f\t%4.19f\t%4.19f\n", a, a+.5, floor(a + 0.5));
}
}
显示了它的输出
10.0000000000000000000 10.5000000000000000000 10.0000000000000000000
10.0999999999999996447 10.5999999999999996447 10.0000000000000000000
10.1999999999999992895 10.6999999999999992895 10.0000000000000000000
10.2999999999999989342 10.7999999999999989342 10.0000000000000000000
10.3999999999999985789 10.8999999999999985789 10.0000000000000000000
10.4999999999999982236 10.9999999999999982236 10.0000000000000000000
10.5999999999999978684 11.0999999999999978684 11.0000000000000000000
10.6999999999999975131 11.1999999999999975131 11.0000000000000000000
10.7999999999999971578 11.2999999999999971578 11.0000000000000000000
10.8999999999999968026 11.3999999999999968026 11.0000000000000000000
10.9999999999999964473 11.4999999999999964473 11.0000000000000000000
10.0000000000000000000 10.5000000000000000000 10.0000000000000000000
10.0999999999999996447 10.5999999999999996447 10.0000000000000000000
10.1999999999999992895 10.6999999999999992895 10.0000000000000000000
10.3000000000000007105 10.8000000000000007105 10.0000000000000000000
10.4000000000000003553 10.9000000000000003553 10.0000000000000000000
10.5000000000000000000 11.0000000000000000000 11.0000000000000000000
10.5999999999999996447 11.0999999999999996447 11.0000000000000000000
10.6999999999999992895 11.1999999999999992895 11.0000000000000000000
10.8000000000000007105 11.3000000000000007105 11.0000000000000000000
10.9000000000000003553 11.4000000000000003553 11.0000000000000000000
11.0000000000000000000 11.5000000000000000000 11.0000000000000000000
的区别:第一运行与累加错误并与0.0999999999999996447步骤你的方法,而第二次运行会尽可能地重新计算,从而可以准确地达到10.5和11.0。
双打和浮点(变量存储的是在浮点标准中)只是近似值。精度不会与精确的十进制值绑定。 – suspectus 2013-03-13 09:19:52
http://stackoverflow.com/questions/5562492/strange-results-with-c-ceiling-function – uba 2013-03-13 09:26:27
有关浮点计算的大量细节:http://docs.oracle.com/cd/E19957-01/806 -3568/ncg_goldberg.html - 网上还有不错的PDF版本。但是glglgl的回答已经说过了。 – Arne 2013-03-13 09:29:05