C语言浮点型精度缺失解决

举报
计算机魔术师 发表于 2022/08/28 19:14:26 2022/08/28
【摘要】 原题:判断求解二元一次方程的根,在判断根的情况,按照数学知识理解,我是在代码 中以if Δ<0 来判断根的情况的但是在答案中代码判断语句则是 Δ<1e-6那么为什么是要用10^-6 来判断?为什么不用0呢?在百思不得其解下 ,我查阅各个文章都没有很好的 专门关于 浮点精度缺失 导致 预期结果 的文章所以在此记录,结果:其实在C语言中浮点型是有误差的,会导致结果不一样,比如我们不可以直接把两...

原题:

  • 判断求解二元一次方程的根,

在判断根的情况,按照数学知识理解,我是在代码 中以if Δ<0 来判断根的情况的

但是在答案中代码判断语句则是 Δ<1e-6
那么为什么是要用10^-6 来判断?为什么不用0呢?
在百思不得其解下 ,我查阅各个文章都没有很好的 专门关于 浮点精度缺失 导致 预期结果 的文章
所以在此记录,

结果:

  • 其实在C语言中浮点型是有误差的,会导致结果不一样,

比如我们不可以直接把两个浮点型用==和!= 比较的(注:只要是关于大小比较都不可以),因为小数位是不一样的,所以再等号上要比较浮点型解决方法是

abs(x-y) <1e-6(小于则认为二者一样,否则不一样(大于或者小于,要得到具体去掉绝对值函数abs()即可),因为两者差非常小,接近于0)其中在这里就把系统那一部分精度问题解决了,对于其他情况下举一反三。

对应原题例子:

比如这样一个情况 1/3 - 1/3 按照数学知识 应该为0 但如果在设置中精度不同,
如在不同精度下 结果会为
一个为0.3333333一个为0.3333那结果是0.0000333就不为0

那么如果此时判断语句为if Δ<0就不能达到预期效果了,所以为了避免这种情况,解决办法:

  • 设置一个足够小的值(一般情况用10e-6)当作0,使其作为浮点型之间判断大小的准则,就可以避免出现精度损失导致判断语句分支错误或达不到所要效果。

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。