[問題] 浮點數是否適合比較大小

作者: 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