在函数中,根据问题领域所容许的的精度,定义一个误差上限(一个极小数)。然后在浮点计算时,计算结果与这个误差上限作比较,而不是与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;
}