[問題] float 精準度觀念問題
我理解為什麼float會有誤差值
但是今天朋友討論一件事情
if (float_var == 1.0f) 這樣寫到底有什麼錯(我認知是 這樣寫 變數的值要完全跟1.0
四個byte的memcmp要一樣)
1. 在誤差範圍內 (https://en.cppreference.com/w/cpp/types/numeric_limits/epsilo
n)
如果是趨近於1的數字 我這樣判斷會失敗 導致邏輯錯誤? 所以因為這樣條件太嚴苛
對於經過運算後的float數值 很可能有一點點誤差產生就不成立了?
2. 如果是要完全的相等 , 我能把一個float 一個byte一個byte判斷是否相等來判斷是不
是等值嗎?
例如
typedef union
{
float value;
unsigned char bytes[4];
} IEEE754;
IEEE754 one;
one.value = 1.0f;
IEEE754 target;
target.value = input;
然後memcmp 兩者的bytes
還是 float 的== 實作上就是byte compare?
3. 浮點數運算出現誤差,可以理解成 當除不盡 或是 除完小數點超過二進位小數 23位
無法表示
就會產生誤差?
4. 因為看不懂std::numeric_limits<T>::epsilon 的那個almost_equal在幹嘛 所以找了
一下
https://stackoverflow.com/a/17341/588477
這篇的方法好像是有道理但是請看以下測試
https://ideone.com/MH6jJW
我看VC直接寫
#define FLT_EPSILON 1.192092896e-07F // smallest such that 1.0+FLT
_EPSILON != 1.0
GCC我用gcc -E -dM 去dump (我不知道為什麼找不到定義???怎麼解釋 https://tinyurl.
com/y8heekq8 )
#define __FLT_EPSILON__ 1.19209289550781250000e-7F
奇怪為什麼會是這樣
a. stackoverflow的作法錯了?
b. 為什麼會把差值當成相等?
c. 到底這個epsilon 最應該用在哪裡呢?
d. 是不是把almost_equal當成一個正解 才是正確的浮點數比較相等呢?
我用以下tool 把 epsilon 看他hex form 反推一下
他是2^-23 = 0.00000011920928955078125f乍看之下跟gcc定義一致
https://www.h-schmidt.net/FloatConverter/IEEE754.html
觀念上有些錯誤
請大家修正一下
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.247.37.201
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1537266560.A.860.html
※ 編輯: lovejomi (27.247.37.201), 09/18/2018 18:36:56
※ 編輯: lovejomi (27.247.37.201), 09/18/2018 18:44:25
→
09/18 19:21,
6年前
, 1F
09/18 19:21, 1F
→
09/18 19:24,
6年前
, 2F
09/18 19:24, 2F
→
09/18 19:24,
6年前
, 3F
09/18 19:24, 3F
→
09/18 19:49,
6年前
, 4F
09/18 19:49, 4F
→
09/18 19:49,
6年前
, 5F
09/18 19:49, 5F
→
09/18 19:50,
6年前
, 6F
09/18 19:50, 6F
※ 編輯: lovejomi (110.28.193.230), 09/18/2018 20:14:20
※ 編輯: lovejomi (110.28.193.230), 09/18/2018 20:59:20
※ 編輯: lovejomi (110.28.193.230), 09/18/2018 21:02:52
→
09/18 21:03,
6年前
, 7F
09/18 21:03, 7F
→
09/18 21:06,
6年前
, 8F
09/18 21:06, 8F
推
09/18 21:08,
6年前
, 9F
09/18 21:08, 9F
推
09/18 21:19,
6年前
, 10F
09/18 21:19, 10F
推
09/18 21:26,
6年前
, 11F
09/18 21:26, 11F
→
09/18 21:27,
6年前
, 12F
09/18 21:27, 12F
→
09/18 21:28,
6年前
, 13F
09/18 21:28, 13F
推
09/18 21:39,
6年前
, 14F
09/18 21:39, 14F
推
09/18 22:01,
6年前
, 15F
09/18 22:01, 15F
推
09/18 22:41,
6年前
, 16F
09/18 22:41, 16F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章