程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 浮點數比較問題(float x 與 '零值'比較),float零值

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

編輯:關於C語言

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


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

  據說這是騰訊的面試題:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved