[问题] 浮点数是否适合比较大小

楼主: xxxx9659 (嘎嘎嘎嘎嘎)   2014-08-12 18:05:06
浮点数作等于运算适合吗??
double d1, d2;
d1 = 0.0;
d2 = 0.0;
if(d1 == d2) printf("OK!\n");
d1 += d2;
d1 -= d2 * 123.45;
d1 *= d2 * 543.21;
if(d1 == d2) printf("OK!\n");
就上面的程式来看
真的会如我们所想的这样,两个 if 都成立??
这样做是否有风险?? (不同的编译环境 or 运算误差之类的)
还是这程式 100% 一定不可能有错??
作者: bibo9901 (function(){})()   2014-08-12 18:16:00
不适合, 最好用 abs(d1 - d2) < 某个误差值 来表示相等
作者: iamstudent (stu)   2014-08-12 19:20:00
这是数值精准度问题,你要实验的话,两个数字不要0
作者: diabloevagto (wi)   2014-08-12 19:57:00
置顶文第11戒
作者: LiloHuang (十年一刻)   2014-08-12 23:00:00
这篇文章个人认为值得一看 :D http://goo.gl/bpeuR0除了最常见的误差值比较方式,还有一些具技巧性的比较
作者: lNishan (紫小霓)   2014-08-13 02:10:00
推楼上分享 :) 已bookmark 有空看
作者: Killercat (杀人猫™)   2014-08-13 06:32:00
如果要有==需求的话 打从一开始就不该用float这就跟java的String ==一样 根本不是字面上的“相等”意思 而是指“bitwise equal”(java string则是指reference equal)
作者: QQ29 (我爱阿蓉)   2014-08-13 09:10:00
像是c# java 的compare function用来比浮点数 有风险吗
作者: Killercat (杀人猫™)   2014-08-13 09:25:00
浮点计算根本就不该== 任何语言都一样...因为所有语言的浮点都是走IEEE754 可以参考一下spec他是spec面上就不该==了 跟语言实作没有关系但是他允许有限精确度的compare(大于小于)就是不过compare要注意最小精确度的问题

Links booklink

Contact Us: admin [ a t ] ucptt.com