兩個float 怎么比較大小


轉自:http://blog.csdn.net/mydriverc2/article/details/49888947

 

float 類型不能比較相等或不等,但可以比較>,<,>=,<=

用==從語法上說沒錯,但是本來應該相等的兩個浮點數由於計算機內部表示的原因可能略有微小的誤差,這時用==就會認為它們不等。應該使用兩個浮點數之間的差異的絕對值小於某個可以接受的值來判斷判斷它們是否相等,比如用

    if (fabs(price - p) < 0.000001)

來代替

    if (price == p)

 

很多工程的應用都是采用計算精確度的方式

 

定義一個精度,用差的絕對值比較,在精度范圍內就認為是相等的;大小可以直接比較。

 

【規則4-3-3】不可將浮點變量用“==”或“!=”與任何數字比較。
千萬要留意,無論是float 還是double 類型的變量,都有精度限制。所以一定要
避免將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。
假設浮點變量的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允許的誤差(即精度)。

 

計算機表示浮點數(float或double類型)都有一個精度限制,對於超出了精度限制的浮點數,計算機會把它們的精度之外的小數部分截斷。因此,本來不相等的兩個浮點數在計算機中可能就變成相等的了。例如:

    float a=10.222222225,b=10.222222229
    數學上a和b是不相等的,但在32位計算機中它們是相等的。
 
    如果兩個同符號浮點數之差的絕對值小於或等於某一個可接受的誤差(即精度),就認為它們是相等的。
    不要直接用“==”或者“!=”對兩個浮點數進行比較,但是可以直接用“<”和“>”比較誰大誰小。
test.cpp
****************************************
#include
#include
#define EPSILON 1e-6
int main(void)
{
  float a = 0.000003;
  float b = 0.000005;
  printf("a=%f/n",a);
  printf("b=%f/n",b);
  printf("abs(a-b)=%f/n",abs(a-b));
  printf("fabs(a-b)=%f/n",fabs(a-b));
  if ( fabs(a-b) <= EPSILON )  //判斷浮點數是否相等
  {
 printf("a==b/n");
  }else
  {
 printf("a!=b/n");
  }
  if ( fabs(a) <= EPSILON)  //判斷浮點數是否等於0
  {
 printf("a==0/n");
  }else
  {
 printf("a!=0/n");
  }
  if (a > b)  //比較兩個浮點數的大小,
  {
 printf("a>b/n");
  }else
  {
 printf("a
  }
  return 0;
}

 


免責聲明!

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



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