浅谈浮点数精度中的误差

    浮点型数据是表示具有小数点的实数的。为什么在C中把实数称为浮点数呢?在C语言中,实数是以指数形式存放在存储单元中的。我们都知道实数是一个连续的无穷集合,即使在0—1这个区间也会有无穷个数,计算机会把1.0000000000001默认为1,也会把0.99999999999默认为1,这样,就会出现误差。
   在数学中,我们常常会看到“误差为1m”“误差范围”这样的字眼。比如:官方公布A、B两地距离为200m,存在1m误差。但是测量数据出现199.9,189.9,201.1这样的数据,显然,只有199.9这组数据更符合实际,因为存在1m误差的合理范围为[199,201],而189.9,201.1都不在这个范围内。因此我们可以做出这种总结:设真实值为x,给出值为y,误差为r;则:y-r<=x<=y+r。

在编程过程中,我们常常会遇到一个变量和一个准确的数进行比较,最经典的就是判断一个数和0的大小。比如说:a等于0,我们会直接写成 a==0,但在认识到精确度问题后,我们就很自然的考虑误差问题。对此,我们不妨定义一个宏,设置其误差范围。以一元二次方程ax^2+bx+c=0求解为例:
#define EPS 0.000001
void Fun(double a,double b,double c)
{
    double x1;
    double x2;
    double d=b*b-4*a*c;
    if(0-EPS<=a&&a<=EPS)//判断a==0
    {
        x1=x2=-c/b;
	printf("x1=%f,x2=%f\n",x1,x2);
    }
    else if(0-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");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值