float,double分別遵循r32-24,r64-53的標準,
他們的位數分別是23,52,
即誤差在2^-23,2^-52;
所以float的精度誤差在1e-6,double精度誤差在1e-15 。
所以要判斷乙個單精度浮點數:則是if( fabs(f_float) <= 1e-6);
要判斷乙個雙精度浮點數:則是if( fabs(d_double) <= 1e-15 );
判斷兩個浮點數相等:
if( fabs(a_float-b_float) <= 1e-6);
if( fabs(x_double-y_double) <= 1e-15);
#define float_eps 1e-6
#define double_eps 1e-15
float f_float,f1_float,f2_float;
double d_double,d1_double,d2_double;
/* 要判斷乙個單精度浮點數等於0 */
if( fabs(f_float) <= float_eps );
/* 要判斷乙個雙精度浮點數等於0 */
if( fabs(d_double) <= double_eps );
/* 要判斷兩個浮點數是否相等 */
if( fabs(f1_float-f2_float) <= float_eps );
if( fabs(d1_double-d2_double) <= double_eps );
常用定義巨集:
#define float_eps 1e-6
#define double_eps 1e-15
eps=epsilon(=ε)
補充:abs與fabs區別
abs 返回整形資料的絕對值。
標頭檔案:#include
用 法: int abs(int i);
fabs 返回浮點資料的絕對值。
標頭檔案:#include
用法:float fabs(float x);
求絕對值的資料型別是整形就用abs,是浮點型就用fabs。
浮點數判斷是否為0
浮點數因為儲存形式的原因不能直接和0值比較,當要判斷乙個浮點數是否等於0時 fabs x 1e 6 就是認為是0了 float,double分別遵循r32 24,r64 53的標準。所以float的精度誤差在1e 6 double精度誤差在1e 15 所以要判斷乙個單精度浮點數 則是if abs f...
判斷浮點數是否為0
看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...
精確判斷乙個浮點數是否等於0
看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...