[問題] 浮點數比較問題

看板C_and_CPP作者 (popular)時間9年前 (2016/02/19 20:58), 編輯推噓4(407)
留言11則, 3人參與, 最新討論串2/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 浮點數因為有誤差,因此在做比較時會讓兩數相減後取絕對值 例如: float a=0.0; while(a != 1.0) a+=0.1; 這個例子會有無窮迴圈 所以需要改成如下: float a=0.0; while(abs(a-1.0)<=0.001) a+=0.1; 這樣才不會無窮迴圈 但是,0.001是如何決定? 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.77.239.19 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455886728.A.EDA.html

02/19 21:15, , 1F
隨你, 夠小就好
02/19 21:15, 1F

02/19 21:25, , 2F
std::numeric_limits::epsilon() http://goo.gl/Rgqyy3
02/19 21:25, 2F

02/19 21:52, , 3F
樓上這個差距大概多算個幾次就不成立了吧
02/19 21:52, 3F

02/19 21:53, , 4F
那個值是 1 跟比 1 大的最小浮點數之間的差
02/19 21:53, 4F

02/19 21:54, , 5F
所以當多次運算誤差變大後就不會滿足了
02/19 21:54, 5F

02/19 21:54, , 6F
基本上這種東西取多少真的要看需求, 有的 0.001 就夠
02/19 21:54, 6F

02/19 21:55, , 7F
有的可能會到 1e-5 或 1e-8 甚至 1e-10 都有可能
02/19 21:55, 7F

02/19 21:58, , 8F
樓上說的沒錯,忘了說重點是在於網頁裡面的範例
02/19 21:58, 8F

02/19 22:01, , 9F
Google C++ Test 裡面的 AlmostEquals 我記得更加完善
02/19 22:01, 9F

02/20 21:06, , 10F
有比較簡單的方法,放大10^n以後硬轉int
02/20 21:06, 10F

02/20 21:06, , 11F
n要多少自己決定
02/20 21:06, 11F
文章代碼(AID): #1Mnn68xQ (C_and_CPP)
文章代碼(AID): #1Mnn68xQ (C_and_CPP)