我试图用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,请修改此复数,如其他海报所示.
像这样的东西会起作用:
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等退化情况的检查.不眠之夜!
| 归档时间: |
|
| 查看次数: |
14123 次 |
| 最近记录: |