先来看一段程序:
int main()
{
double n=0.01;
double tmp=0;
for(int i=0;i<40000000;i++)
{
tmp+=n;
}
printf("%f",tmp);
return 0;
}
从这段程序中可以明显看出编译结果产生了误差,所以浮点数的计算中是存在误差的。
#include<stdio.h>
int main()
{
float a=1234456;
float b=1234456.000001;
if(a==b)
{
printf("相等");
}
return 0;
}
上面这个程序输出了相等,所以浮点数在计算中,应谨慎使用,那么我们如何减少误差呢?我们用一元二次方程求解的程序来解释:
#include<stdio.h>
#include<math.h>
#define EPS 0.000001
void Solution(double a,double b,double c)
{
double disc=b*b-4*a*c;
if(a>=-EPS&&a<=EPS)
{
printf("%f",-b/c);
}
else if(disc>=-EPS&&disc<=EPS)
{
printf("r=%f",-b/2*a);
}
else if(disc>EPS)
{
printf("r1=%f",(-b+sqrt(disc))/2*a);
printf("r2=%f",(-b-sqrt(disc))/2*a);
}
else if(disc<-EPS)
{
printf("此方程无解");
}
}
int main()
{
double a,b,c;
Solution(1,-2,1);
return 0;
}
我们用宏来定义一个我们可接受的误差范围来尽量减少误差。
转载:https://blog.csdn.net/weixin_44018317/article/details/102571150
查看评论