浮點數的比較問題,不能直接比較,需用精度

來源:互聯網
上載者:User

浮點數比較問題

1、直接進行關係比較的錯誤(==)

浮點數可以進行比較,但是由於不同浮點類型中表示精度的差異,所以會引起一些錯誤。

例1
:

#include <iostream.h>

void main()

{

       float
f1=7.123456789;

float f2=7.123456787;

cout<<(f1!=f2?”not same/n”:”same/n”);   

float g=1.0/3.0;

double d=1.0/3.0;

cout<<(g = =d?”same/n”:”not same/n”);

}

運行結果:

same            //f1與f2相同

not same         //g與d不同

f1與f2的前6位有效數位相等而後面的數不同,在電腦中可能被表示為同一個數。因float型精度有限,不能分辨其差異,造成判斷有誤(認為是相同的數)。解決的方法是使用double型資料。

例2:

#include <iostream.h>

#include <math.h>

#include <iomanip.h>

void main()

{

double d1=123456789.9*9;

double d2=1111111109.1;

cout<<(d1==d2?"
same/n":"not same/n");   

cout<<
((fabs(d1-d2)<1e-6)?"same/n":"not same/n");

cout<<setprecision(9);

cout<<setiosflags(ios::fixed)<<d1<<"/n"<<d2<<"/n";

}

運行結果:

not same

same

1111111109.100000143

1111111109.099999905

2、使用浮點數進行相等(==)和不相等(!=)比較的操作通常是有問題的。浮點數的相等比較,一般用兩者相減的值是否落在0的鄰域中來判斷。

3、測試一個浮點值與零的關係也存在誤差。

在林銳的<<高品質C/C++編程>>中提到:不可將浮點變數用“==”或“!=”與任何數字比較。原因是有精度限制。應該轉換成以下形式  

 
if   ((x>=-EPSINON)   &&  
(x<=EPSINON))  

 
其中EPSINON是允許的誤差(即精度)。 

浮點數與0的比較:

 之所以要這樣if(fabs(i)<=1e-6),是因為對於一個數,在數學上,只要這個數小於一個任意小的正數,我們就可以說這個數等於零。這是與極限相關的一個概念。如果想深入瞭解為什麼,可以看看數學分析。  
  所以,在電腦編程時,我們之所以用這樣的方法來比較實型,是因為這樣可以任意達到所需的精度,也就是說fabs(i)可以小於更大或者更小的一個數來達到確認是否等於零的目的。

浮點數與零的比較:

等於0關係:  fabs(i)<=1e-6

大於0關係:  i>1e-6

小於0關係:  i<1e-6

例:求一元二次方程的解


a=0
不是二次方程,是一次方程


b2-4ac=0
有兩個相等實根


b2-4ac>0
有兩個不等實根


b2-4ac<0
有兩個共軛複根

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//c代碼

#include <stdio.h>

#include <math.h>

main( )


       double
a,b,c,disc,x1,x2,realpart,imagpart;

   
printf("請輸入a,b,c:");

   
scanf("%lf%lf%lf",&a,&b,&c);

   
if(fabs(a)<=1e-6)  

              printf("不是2次方程, 是1次方程/n");

    else

    {

              disc=b*b-4*a*c;

              if(fabs(disc)<=1e-6)

                     printf("有兩個相等的實根:%f",(-b/(2*a)));

              else  if(disc>1e-6)

              {

                     x1=(-b+sqrt(disc))/(2*a);

            x2=(-b-sqrt(disc))/(2*a);

                     printf("有兩個不等的實根:/n");

                     printf("x1=%f/n",x1);

                printf("x2=%f/n",x2);

              }

              else

              {

                     realpart=-b/(2*a);

                     imagpart=sqrt(-disc)/(2*a);

                     printf("有兩個複根:/n");

                  printf("%f+%fi/n",realpart,imagpart);

                  printf("%f-%fi/n",realpart,imagpart);

              }

       }  

}

 

 

 

 

 

 

 

 

 

 

 

//C++代碼

#include <iostream.h>

#include <math.h>

#include <iomanip.h>

void   main( )


       double
a,b,c,disc,x1,x2,realpart,imagpart;

   
cout<<"請輸入a,b,c:";

   
cin>>a>>b>>c;

   
if(fabs(a)<=1e-6)  

              cout<<"不是2次方程,
是1次方程/n";

   
else

   
{

              disc=b*b-4*a*c;

              if(fabs(disc)<=1e-6)

                     cout<<"有兩個相等的實根:"<<(-b/(2*a));

              else  if(disc>1e-6)

              {

                     x1=(-b+sqrt(disc))/(2*a);

            x2=(-b-sqrt(disc))/(2*a);

                     cout<<"有兩個不等的實根:/n";

                     cout<<setprecision(5)<<"x1="<<x1<<endl;

                     cout<<setprecision(5)<<"x2="<<x2<<endl;

              }

              else

              {

                     realpart=-b/(2*a);

                     imagpart=sqrt(-disc)/(2*a);

                     cout<<"有兩個複根:/n";

                     cout<<setprecision(5)<<realpart<<"+"<<imagpart<<"i"<<endl;

                     cout<<setprecision(5)<<realpart<<"-"<<imagpart<<"i"<<endl;

              }

       }  

}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.