-3

我的代码适用于:(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;

我该如何补救?

4

2 回答 2

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

于 2011-10-13T18:05:40.867 回答
1

sqrt((b*b) - (4 * a * c))你的输入是sqrt(-4). 根据http://www.cplusplus.com/reference/clibrary/cmath/sqrt/If the argument is negative, a domain error occurs, setting the global variable errno to the value EDOM. 我没有看到在这种情况下返回的定义。不管怎样,这是错误的。

我看到你complexType的代码中有。如果这是一个 typedef std::complex<T>,那么代码很容易修复。

complexType top = b*b - 4*a*c;
solu1 = (-b + sqrt(top)) / (2*a);
solu2 = (-b - sqrt(top)) / (2*a);

由于. std::sqrt_std::complex<T>

于 2011-10-13T18:07:18.063 回答