[关闭]
@bintou 2018-10-22T03:36:08.000000Z 字数 792 阅读 773

浮点数陷阱

C语言 CSI 浮点数 陷阱


运行以下程序,解释为什么。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. double i, endFlag = 10.0;
  5. for(i = 9.0; i != endFlag; i += 0.1) {
  6. printf("i = %.11f\n", i);
  7. if(i > endFlag){
  8. printf("Overflow. i = %.11f\n", i);
  9. break;
  10. }
  11. }
  12. i = 9.9;
  13. i += 0.1;
  14. printf("i = %.11f\n", i);
  15. if(endFlag != i)
  16. printf("They are not equal!\n");
  17. else
  18. printf("They are the same!\n");
  19. return 0;
  20. }

类似的程序,只是改变了精度,我们看到了什么? 再运行看看?

  1. #include <stdio.h>
  2. int main()
  3. {
  4. double i, endFlag = 10.0;
  5. for(i = 9.0; i != endFlag; i += 0.1){
  6. printf("i = %.50lf\n", i);
  7. if(i > endFlag){
  8. printf("Overflow. i = %.50lf\n", i);
  9. break;
  10. }
  11. }
  12. i = 9.9;
  13. printf("i = %.50f\n", i);
  14. i += 0.1;
  15. printf("i + 0.1 = %.50f\n", i);
  16. printf("endFlag = %.50f\n", endFlag);
  17. if(endFlag != i)
  18. printf("They are not equal!\n");
  19. else
  20. printf("They are the same!\n");
  21. return 0;
  22. }

怎么办?使用精度控制,在以上代码中增加以下代码。再看看?

  1. #define PRECISION 0.0000000000001
  2. for (i = 0; !(i < 10 + PRECISION && i > 10 - PRECISION); i += 0.1){
  3. printf("%.12lf\n", i);
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注