【C++菜鳥問題】C++浮點數(float、double)比較、相等判斷

文章推薦指數: 80 %
投票人數:10人

用"=="來比較兩個double應該相等的類型,返回真值完全是不確定的。

計算機對浮點數的進行計算的原理是隻保證必要精度內正確即可。

我們在判斷 ... 請輸入正確的登錄賬號或密碼 註冊 忘記密碼 首頁 未分類 正文 【C++菜鳥問題】C++浮點數(float、double)比較、相等判斷 原創 miaoyue_mm12344 2018-08-2612:00 浮點數在內存中的存儲機制和整型數不同,其有舍入誤差,在計算機中用近似表示任意某個實數。

具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數爲10的科學記數法。

所以浮點數在運算過程中通常伴隨着因爲無法精確表示而進行的近似或舍入。

但是這種設計的好處是可以在固定的長度上存儲更大範圍的數。

1、將字符串轉換爲float、double過程存在精度損失,只是float、double各自損失的精度不相同而已    std::stringstr="8.2";    floatcc=atof(str.c_str());  //cc的值爲8.1999998    std::stringstr="8.2";    doublecc=atof(str.c_str());  //cc的值爲8.19999999999999932、將float、double轉換爲字符過程中可能存在精度損失,但是通過%.8lf可以規避(1)float小數點前後加起來有效數字只有6位。

當給定的float有效數在6位以內轉換爲字符不會丟失精度,當有效位數大於6位就會存在精度丟失    //精度沒有丟失    charbuf[100]={'\0'};    floataa=8000.25;    sprintf(buf,"%f",aa);   //8000.250000    //精度沒有丟失    charbuf[100]={'\0'};    floataa=8.00025;    sprintf(buf,"%f",aa);   buf=8.000250    //精度丟失,存在誤差    charbuf[100]={'\0'};    floataa=8000.251;    sprintf(buf,"%f",aa);  //8000.250977    //精度丟失,存在誤差此時使用.8lf也無效    charbuf[100]={'\0'};    floataa=8000.251;    sprintf(buf,"%.8lf",aa);//8000.25097656    (2)double小數前後加起來的有效數字只有16位,當給定的double有效數在16位以內轉換爲字符串不會丟失精度,當有效位數大於16位就會存在精度丟失    存在誤差    charbuf[100]={'\0'};    doubleaa=121.437565871234012;    sprintf(buf,"%.20lf",aa);//121.43756587123401000000    //沒有誤差    charbuf[100]={'\0'};    doubleaa=8000.256165;    sprintf(buf,"%.8lf",aa);    std::cout<=-EPSINON)&&(x<=EPSINON) 這樣判斷是可取的至於爲什麼取0.00001,可以自己按實際情況定義。

  也可以abs(x)<= EPSINON比如要判斷浮點數floatA和B是否相等,我們先令float x=A–B;並設constfloatEPSINON=0.00001;  則if((x>=-EPSINON)&&(x<=EPSINON);//或者if(abs(x) <=EPSINON)cout< usingnamespacestd; #include intmain() { floatf=1.23; doubled=1.23; if(f==d) printf("equal\n"); else cout< #include intmain() { floatf1=1.23; doublef2=1.23; std::cout<(int&)f2)<<:endl std::cout return0 public: union dwordm_dwint floatm_ffloat struct intm_nfra:23 intm_nexp:8 boolm_bsign:1>  #include  int main()  {  float f1 = 1.23;   float f2 = 1.24;  std::cout< (int&)f2)<<:endl> #include intmain() { floatf1=1.23; floatf2=1.24; std::cout<(int&)f2)<<:endl std::cout return0>0) ? ((int&)f1) : ( (int&) f1 - 0x80000000 );  i2 = (f2>0) ? ((int&)f2) : ( (int&) f2 - 0x80000000 );  return ((abs(i1-i2))



請為這篇文章評分?