Вывод квадратного уравнения C ++: -1. # IND - PullRequest
0 голосов
/ 13 октября 2011

Мой код работает нормально с: (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 ]

3 голосов
/ 13 октября 2011

Вы пытаетесь найти реальное решение для 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 голос
/ 13 октября 2011

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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...