在函数中,根据问题领域所容许的的精度,定义一个误差上限(一个极小数)。然后在浮点计算时,计算结果与这个误差上限作比较,而不是与0作比较。如果与0进行比较,误差会使程序结果发生改变,如下图中的球一元二次方程式的解,由于误差,所以程序结果出现错误。

浮点数与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,将其精度确定,减少其误差,那可以得到正确的答案。

 

如下

浮点数与0值的比较浮点数与0值的比较

浮点数与0值的比较

 

而结果也会得到正确的结果

浮点数与0值的比较

 

 

 

其代码如下

#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比较时,需要提前定义精度。

相关文章: