用C++求解二次方程

6 c++ math equation quadratic

我试图用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;
Run Code Online (Sandbox Code Playgroud)

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

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

x ^ 2 + 2x + 5

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

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

谢谢你的帮助!

And*_*ein 22

对所有这一切都很重要.这些回答和原始问题中显示的解决方案并不健全.

公知的溶液(-b + - SQRT(B ^ 2 - 4AC))/ 2a中已知是在计算非鲁棒当交流很小司仪到b ^ 2,因为一个被减去两个非常相似的值.对于另一个根,最好使用鲜为人知的解2c /( - b - + sqrt(b ^ 2 -4ac)).

强大的解决方案可以计算为:

temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;
Run Code Online (Sandbox Code Playgroud)

使用符号(b)确保我们不减去两个相似的值.

对于OP,请修改此复数,如其他海报所示.

  • +1 这在计算上明显比`(-b +/- sqrt(b*b - 4*a*c))/(2a)` 更健壮。顺便说一句:由于`temp` 可能是0.0,所以通常需要进行预除法检查。(例如 a,b,c = 1,0,0)。 (2认同)

Bli*_*ndy 7

像这样的东西会起作用:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么要定义一对和复杂类型?两者都已经存在! (2认同)