读书人

浮点数的陷阱?解决思路

发布时间: 2012-06-16 20:34:32 作者: rapoo

浮点数的陷阱?
下面这段代码会永无止尽地运行。这是为什么呢?

C/C++ code
#include <stdio.h>int main(){    freopen("output.txt","w",stdout);    double i;    for(i = 0;i != 10;i+=0.1){          printf("%.1lf\n",i);              }    return 0;}


最后,我用过重定向输入到文本文件,我观察了输出结果:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5.0
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
6.0
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
7.0
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
8.0
8.1
8.2
8.3
8.4
8.5
8.6
8.7
8.8
8.9
9.0
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
10.0
10.1
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9
11.0
11.1
11.2
11.3
11.4
11.5
11.6
11.7
11.8
11.9
12.0
12.1
12.2
12.3
12.4
12.5
12.6
12.7
12.8
12.9
永无止境地输出……这是why?

[解决办法]
浮点数的精度问题吧!
[解决办法]
浮点数不是精确存储的,不能直接比较相等

可以试试
for(i = 0;i < 10;i+=0.1){

[解决办法]
精度问题
[解决办法]
for(i = 0;i <10.01;i+=0.1){
printf("%.1lf\n",i);

}
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

[解决办法]
i == 10有问题
[解决办法]
浮点数是有精度的,
看你要比较到什么精度了,
直接== 是有问题的,一般是 大于 小于 一个范围

[解决办法]
在循环次数控制的时候,很多应该写<,<=,>,>=的地方都被程序员误写为==和!=了。
但用iterator的地方除外。
[解决办法]
i != 10



改为


abs(i-10) < 浮点误差 (见相关头文件的定义)

读书人网 >C语言

热点推荐