我的代码可以正常使用:(1,-2,-8),当我输入a = 1 b = 0 c = 1时,它给出了上面的错误,
这是我的代码:
double x=0,a=0,b=0,c=0,d=0;
complexType solu1;
complexType solu2;
cout << "\n\nEnter values of quadratic a,b,c:";
cin >> a >> b >> c;
double solution1 = (-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
solu1 = solution1 / (2*a);
cout << setprecision(5) << solu1;
double solution2 = (-b) - (sqrt((b*b) - (4 * a * c)));
solu2 = solution2 / (2*a);
cout << setw(5) << setprecision(5) << solu2;
我该如何解决这个问题?
答案 0 :(得分:3)
您正在尝试找到x^2 + 1 = 0
的真正解决方案,它只有虚构的解决方案。
如果要求解所有二次方程,则需要检查判别式是否为正,以确定解是真实还是复杂:
double d = b*b - 4*a*c;
if (d >= 0) {
double sol1 = (-b + sqrt(d))/(2*a);
double sol2 = (-b - sqrt(d))/(2*a);
std::cout << sol1 << ", " << sol2 << '\n';
} else {
double real = -b/(2*a);
double imag = sqrt(-d)/(2*a);
std::cout << real << " +/- " << imag << "i\n";
}
如果您愿意,可以使用std::complex
做一些更适合的事情。
答案 1 :(得分:1)
sqrt((b*b) - (4 * a * c))
为sqrt(-4)
。根据{{3}},If the argument is negative, a domain error occurs, setting the global variable errno to the value EDOM.
我没有看到它在这种情况下返回的定义。无论哪种方式,那都是错的。
我看到你的代码中有complexType
。如果这是std::complex<T>
的typedef,那么代码很容易修复。
complexType top = b*b - 4*a*c;
solu1 = (-b + sqrt(top)) / (2*a);
solu2 = (-b - sqrt(top)) / (2*a);
由于std::sqrt
有std::complex<T>
的重载。