我试图在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等退化情况的检查.不眠之夜!