元亨利贞t 2019-08-08 17:30 采纳率: 0%
浏览 1775

C语言求方程ax²+bx+c=0的解判断b²-4ac是否等于0为什么是判断它绝对值小于一个人很小的数(如10^-6)

《C程序设计》第五版唐浩强著一书求方程ax²+bx+c=0的解给出的代码中,判断b²-4ac是否等于0是判断它绝对值小于一个人很小的数(如10^-6),他给出的解释是:

   “对于判断b2-4ac是否等于0时,要注意:由于disc(即b2-4ac)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:“if(disc==0)…”,因为这样可能会出现本来是零的量,由于上述误差而被判别不等于零而导致结果错误。所以采取的办法是判别disc的绝对值(fabs(disc))是否小于一个很小的数(例如10-6),如果小于此数,就认为disc等于0。“

这里在代码中是小于等于10^-6,这是细节问题。

既然 b²-4ac可能出现本来等于0在计算机中可能却不等于0,那么为什么不会出现本来不等于0在计算机中等于0呢?

还有这里说采取的办法是判别disc的绝对值(fabs(disc))是否小于等于10^-6,本来是0计算机中绝对值有两种情况:可能为0,也可能不为0,但绝对值都小于等于10^-6,这证明计算机是可以存绝对值小于等于10^-6却不等于0的数的,那么会不会出现其他情况:本来不等于0在计算机中的结果绝对值小于等于10^-6的数(自然也不会等于0),比如上述绝对值小于等于10^-6却不等于0的数本身,他们在计算机中可以存储,存起来应该不会有误差,这样有以下情况,本身不等于0,在这个程序却把他认定为0。

判断a是否等于0问题也是这样处理的,a只有存储有可能有误差,没有计算有误差,还有,这里判断b²-4ac是否大于0也是是否大于10^-6,很不理解,希望能够详细解释一下,万分感谢。全部代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
  double a,b,c,disc,x1,x2,realpart,imagpart;
  scanf("%lf,%lf,%lf",&a,&b,&c);
  printf("The equation ");
  if(fabs(a)<=1e-6)
    printf("is not a quadratic\n");
  else
  {
    disc=b*b-4*a*c;
    if(fabs(disc)<=1e-6)
      printf("has two equal roots:%8.4f\n",-b/(2*a));
    else
      if(disc>1e-6)
      {
       x1=(-b+sqrt(disc))/(2*a);
       x2=(-b-sqrt(disc))/(2*a);
       printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
      }
      else
      {
       realpart=-b/(2*a);
       imagpart=sqrt(-disc)/(2*a);
       printf(" has complex roots:\n");
       printf("%8.4f+%8.4fi\n",realpart,imagpart);
       printf("%8.4f-%8.4fi\n",realpart,imagpart);
      }
  }
  return 0;
}  

  • 写回答

3条回答 默认 最新

  • 冰冰的大白兔 2019-08-08 17:42
    关注

    因为计算机有误差,数学值为0的数在计算机中可能是一个很小的数然后10^-6大于这个数就可以控制误差了

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体