浮點數比較問題(float x 與 '零值'比較)


  今天在牛客網上看到一道面試題,看完之后着實吃了一驚,自己平常都沒有在意,看似簡單的問題,實則考驗了語言的基本功.

  據說這是騰訊的面試題:

  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無法作為常量值來進行比較.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM