加入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