C----浮点数的精度问题

本文探讨了在解决实际问题时,浮点类型数值运算中不可避免的误差问题,特别是涉及float、double与整型数比较时的误差考虑。通过求解二次方程实根的示例,介绍了如何定义误差范围EPS并进行正确比较,避免直接比较可能导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在生活中解决实际问题时,存在误差是在所难免的,当然,浮点类型的数也存在误差,当 遇到float,double和整型数比较大小时,并不仅仅时简单的将两个数放在一起比较了。要考虑到误差。

例如 : 求 ax^2+bx+c=0 的实根

代码:

#include <stdio.h>
#include <math.h>
#define EPS 0.00000001 //误差

void   Fun(  double a,double b, double c)
{
         double x1;
        double x2;
        double m = b*b-4*a*c;
   

 
if( -EPS <= a && a <=EPS)  //a==0
   {
     printf("%f \n",-c/b);
   }
 else if  ( m >= EPS) //m>=0
     {
      x1=-b+sqrt(m)/(2*a);
      x2=-b-sqrt(m)/(2*a);

     printf("%f   %f \n",x1,x2);
     }
else if( m<-EPS)  //m<0
    {
      printf("无实根\n");
    }
}

int main()
{
        Fun(2, 4,2);
        Fun(2, 3,2);

        return 0;
}

在这个题中,a,b,c,都是浮点类型的数,当判断a是否等于0时,就不能直接写成 a==0,
因此我们定义 EPS表示误差 ,与0的比较如下图所示;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值