c语言中关于0的问题

这个例题是求二次函数的根,为什么△=0的情况下,代码里写的是△绝对值小于等于一个非常小的数(既fabs(disc)<=1e-6)而不直接是=0呢,这样不会导致△的值还是有... 这个例题是求二次函数的根,为什么△=0的情况下,代码里写的是△绝对值小于等于一个非常小的数(既fabs(disc)<=1e-6)而不直接是=0呢,这样不会导致△的值还是有可能大于或者小于零吗 展开
 我来答
xgn911
2022-11-08 · TA获得超过1363个赞
知道小有建树答主
回答量:1493
采纳率:96%
帮助的人:643万
展开全部

由于计算机能够表示的浮点数精度有限,因此计算机在将浮点数表示为二进制时,会存在精度缺失问题,例如用C语言测试0.1+0.1+0.1-0.3的结果为:

可以发现虽然a打印出来为0.000000(只显示了小数点后6位)

但判断a==0的结果并不为真,说明计算机认为0.1+0.1+0.1-0.3≠0

原因在于0.1的二进制表示为0.000110011001....(后面1001循环)

计算机只能用有限精度来表示无限位的0.1,计算时肯定会引入误差

最终导致三个0.1相加的结果不等于0.3

解决办法是令计算结果a的绝对值与一个非常小的正数相比,如1e-6

当a的绝对值fabs(a)<=1e-6,就可以认为a等于0了,如图:

此时输出为yes,即认为a≈0

猫猫9命
2022-11-08 · TA获得超过199个赞
知道小有建树答主
回答量:1845
采纳率:80%
帮助的人:86.6万
展开全部
这不是C语言的问题,而是只要在计算机中进行计算,就应该如此。

这个值如果是计算值,就会出现误差,除非只是赋值零值。
计算机是二进制计算,而人进行计算是十进制。
比如十进制0.1换算为二进制0.0001 1001 1001 1001....是无限小数,只要进行计算,就会因为电脑计算能力受有效位数限制产生误差
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式