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

看板C_and_CPP作者 (嘎嘎嘎嘎嘎)時間11年前 (2014/08/12 18:05), 編輯推噓5(5012)
留言17則, 8人參與, 最新討論串1/1
浮點數作等於運算適合嗎?? 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% 一定不可能有錯?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.153.169 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407837908.A.FD2.html

08/12 18:16, , 1F
不適合, 最好用 abs(d1 - d2) < 某個誤差值 來表示相等
08/12 18:16, 1F

08/12 19:20, , 2F
這是數值精準度問題,你要實驗的話,兩個數字不要0
08/12 19:20, 2F

08/12 19:57, , 3F
置頂文第11戒
08/12 19:57, 3F

08/12 23:00, , 4F
這篇文章個人認為值得一看 :D http://goo.gl/bpeuR0
08/12 23:00, 4F

08/12 23:00, , 5F
除了最常見的誤差值比較方式,還有一些具技巧性的比較
08/12 23:00, 5F

08/13 02:10, , 6F
推樓上分享 :) 已bookmark 有空看
08/13 02:10, 6F

08/13 06:32, , 7F
如果要有==需求的話 打從一開始就不該用float
08/13 06:32, 7F

08/13 06:32, , 8F
這就跟java的String ==一樣 根本不是字面上的「相等」
08/13 06:32, 8F

08/13 06:33, , 9F
意思 而是指「bitwise equal」
08/13 06:33, 9F

08/13 06:33, , 10F
(java string則是指reference equal)
08/13 06:33, 10F

08/13 09:10, , 11F
像是c# java 的compare function用來比浮點數 有風險嗎
08/13 09:10, 11F

08/13 09:25, , 12F
浮點計算根本就不該== 任何語言都一樣...
08/13 09:25, 12F

08/13 09:26, , 13F
因為所有語言的浮點都是走IEEE754 可以參考一下spec
08/13 09:26, 13F

08/13 09:27, , 14F
他是spec面上就不該==了 跟語言實作沒有關係
08/13 09:27, 14F

08/13 09:28, , 15F
但是他允許有限精確度的compare(大於小於)就是
08/13 09:28, 15F

08/13 09:28, , 16F
不過compare要注意最小精確度的問題
08/13 09:28, 16F

11/11 08:24, , 17F
認真看完 LiloHuang 大大貼的文章 寫的真的很棒!! 謝啦
11/11 08:24, 17F
文章代碼(AID): #1JwURK_I (C_and_CPP)