今天在牛客網上看到一道面試題,看完之后着實吃了一驚,自己平常都沒有在意,看似簡單的問題,實則考驗了語言的基本功.
據說這是騰訊的面試題:
float x 與“零值”比較的if語句為?
- if (x == 0)
- if (x < 0.00001f)
- if (fabs(x) < 0.00001f)
- if (x > -0.00001f)
答案為C,fabs為求浮點數絕對值的函數
1 fabs(x) < 0.00001f 2 //等價於(double)-0.00001f < (double)x && (double)x < (double)0.00001f
float的精度就在7,8位左右,自然只能取0.00001了.
假設浮點變量的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允許的誤差(即精度).在C中,ANSI C已經定義了這些常量:
載入頭文件#include就可以引用
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
這幾個常量了。
- 結論:
- 因為float(double)在計算機內不能精確表示,判斷相等時不能采用等於符號,兩數之差小於一定的精度(自設定)時就認為其相等,在比較兩個浮點數的時候,盡量避免使用"==" 或者"!="來進行直接比較,而是將其轉化成">="或者"<="來比較;
- 許多論壇上經常有人問,為什么float或double型不能用來控制switch流程?答案也是因為這個,float無法作為常量值來進行比較.