C ++二次方程输出:-1。#IND

时间:2011-10-13 17:41:26

标签: c++ quadratic

我的代码可以正常使用:(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;

我该如何解决这个问题?

2 个答案:

答案 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::sqrtstd::complex<T>的重载。