首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

*求达人解释*该怎么处理

2014-01-05 
**********************求达人解释*************************书上的:分数值通常没有浮点数形式的精确表示,

**********************求达人解释*************************
书上的:

分数值通常没有浮点数形式的精确表示,所以不应把相等判断做为结束循环的条件。例如:


for (double x = 0.0; x != 2.0; x += 0.2)
printf_s("%f\n",x);


执行时这是一个无限循环。

那么以上的话可以理解成不应该对浮点数做相等判断吗?但是下面我写的一段代码,当输入0.2时却可以退出循环。


double x = 0.0;
while (true)
{
scanf_s("%lf",&x);
if (x == 0.2) break;
}

printf_s("done");


怎么解释这种现象?
[解决办法]
计算机处理浮点数只能做到近似,举个不太恰当的例子,有时候CSDN上的回复时间看起来是一样的,那为什么又有个先后呢?因为后台的时间还有毫秒,而我们看不到这个,同样对于浮点数来说因为他不“干脆”,所以使用==来判断是有风险的。通常的做法是做差,然后取绝对值,看这个差值是否在精度范围内即可认定是否相等
[解决办法]
楼主应该知道浮点数有一个有效位数,其实浮点数的小数位往后甚至可以输出几十位,所有每一次浮点数做运算都是取若干位有效数字,等于就是近似求取,必然会丢失精度!在浮点数之间做比较时,一般是求两数的绝对值在某个区间内,简单的改了下你的程序
for (x = 0.0; fabs(x-2.0) > 0.00001  ; x += 0.2)
{
    printf("%f\n",x);
}

热点排行