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

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 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键