用C求解二次方程

前端之家收集整理的这篇文章主要介绍了用C求解二次方程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在C中编写一个函数,用二次方程求解X.这是我最初写的,只要答案中没有复杂的数字,这似乎有效:
float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
solution1 = solution1 / (2*a);

cout << "Solution 1: " << solution1 << endl;

float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c)));
solution2 = solution2 / (2*a);
cout << "Solution 2: " << solution2;

例如,如果我使用等式:x ^ 2 – x – 6,我正确得到解3,-2.

我的问题是我如何解释复数…例如,给定等式:

x ^ 2 2x 5

手工解决,我会得到-1 2i,-1 – 2i.

好吧,我猜两个问题,我可以更好地编写上面的内容,还可以说明复杂的数字吗?

谢谢你的帮助!

解决方法

像这样的东西会起作用:
struct complex { double r,i; }
struct pair<T> { T p1,p2; }

pair<complex> GetResults(double a,double b,double c)
{
  pair<complex> result={0};

  if(a<0.000001)    // ==0
  {
    if(b>0.000001)  // !=0
      result.p1.r=result.p2.r=-c/b;
    else
      if(c>0.00001) throw exception("no solutions");
    return result;
  }

  double delta=b*b-4*a*c;
  if(delta>=0)
  {
    result.p1.r=(-b-sqrt(delta))/2/a;
    result.p2.r=(-b+sqrt(delta))/2/a;
  }
  else
  {
    result.p1.r=result.p2.r=-b/2/a;
    result.p1.i=sqrt(-delta)/2/a;
    result.p2.i=-sqrt(-delta)/2/a;
  }

  return result;
}

这样,您可以以类似的方式获得实际和复杂结果的结果(实际结果只是将虚部设置为0).看起来更加漂亮!

编辑:为delta事物修复,并添加了对a = 0等退化情况的检查.不眠之夜!

猜你在找的C&C++相关文章