1. 程式人生 > >浮點數與0值的比較

浮點數與0值的比較

在函式中,根據問題領域所容許的的精度,定義一個誤差上限(一個極小數)。然後在浮點計算時,計算結果與這個誤差上限作比較,而不是與0作比較。如果與0進行比較,誤差會使程式結果發生改變,如下圖中的球一元二次方程式的解,由於誤差,所以程式結果出現錯誤。

測試結果

其程式碼如下

#include "stdio.h"
#include "math.h"


void A(double a,double b,double c)
{
	double x1;
	double x2;
	double d = b*b - 4*a*c;
	if(a=0)
	{
		x1=x2 =-c/b;
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d=0)
	{
		x1=x2=-b/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d >0)//d>0
	{
		x1 = (-b+sqrt(d))/(2*a);
		x2 = (-b-sqrt(d))/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else
	{
		printf("無實根\n");
	}
}




int main()
{
	A(0,1,1);
	A(1,2,1);
	A(2,1,2);
	A(0,1,2);
	A(1,2,1);
	A(1,4,2);
	A(1,1,1);
	return 0;
}

但是如果使用#define,將其精度確定,減少其誤差,那可以得到正確的答案。

如下

而結果也會得到正確的結果

其程式碼如下

#include "stdio.h"
#include "math.h"

#define EPS 0.0000001
void A(double a,double b,double c)
{
	double x1;
	double x2;
	double d = b*b - 4*a*c;
	if(-EPS<=a && a<=EPS)
	{
		x1=x2 =-c/b;
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(-EPS<=d && d<=EPS)//d==0
	{
		x1=x2=-b/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d > EPS)//d>0
	{
		x1 = (-b+sqrt(d))/(2*a);
		x2 = (-b-sqrt(d))/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else
	{
		printf("無實根\n");
	}
}


int main()
{
	A(0,1,1);
	A(1,2,1);
	A(2,1,2);
	A(0,1,2);
	A(1,2,1);
	A(1,4,2);
	A(1,1,1);
	return 0;
}

這個例項告訴我們在以後的程式設計過程中,doublefloat定義的數與0比較時,需要提前定義精度。