2015-09-16 3 views
2

Прошу прощения, если этот вопрос очень прост, но я новичок в C++. Я разрабатываю программу, которая вычисляет 2 корня, используя квадратичную формулу. Однако моя программа не работает, когда мой дискриминант является отрицательным числом.Квадратичное уравнение: отрицательный дискриминант в C++

#define _USE_MATH_DEFINES // for C++ 
#include <cmath> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    int pointa; 
    int pointb; 
    int pointc; 
    int discriminant1; 
    float root1; 
    float root2; 

    cout << "Please enter a, b and c: "; 
    cin >> pointa; 
    cin >> pointb; 
    cin >> pointc; 

    discriminant1 = (pow(pointb, 2)) - (4 * pointa * pointc); 

    root1 = (-(pointb) + sqrt(discriminant1))/(2 * pointa); 
    root2 = (-(pointb) - sqrt(discriminant1))/(2 * pointa); 

    cout << "Root1 :" << root1 << endl; 
    cout << "Root2 :" << root2 << endl; 
    return 0; 

Основная проблема - вход для pointb. Есть ли способ заставить pointb стать положительным числом при возведении в квадрат ввода, подобно добавлению круглых скобок в TI-84? При вводе числа, подобного -1, это приводит к тому, что вся формула становится недействительной.

+0

Работает ли [abs()] (http://www.cplusplus.com/reference/cstdlib/abs/)? –

+0

Кроме того, вы должны рассмотреть подводные камни использования 'pow' с целыми типами. – Hurkyl

+0

Почему отрицательный 'pointb' делает выражение недействительным? Формула только приводит к комплексным числам, если * дискриминант * отрицателен. – owacoder

ответ

1

Чтобы использовать абсолютное значение, вы можете использовать abs() из заголовка <cstdlib>.

Однако, как я узнал, если дискриминант отрицательный, это просто означает, что решения нет.

Так что может быть лучшим решением просто добавить предложение if, чтобы выполнить только ту часть формулы, если дискриминатор положителен.

В более продвинутой математике квадратный корень отрицательного числа имеет ответ в комплексной плоскости. Чтобы получить этот результат, вы можете использовать тип данных complex<double> и использовать перегруженную версию sqrt(), которая принимает комплексное число.

+0

На самом деле, когда детерминант отрицательный, на комплексной плоскости есть решение. В этом случае вы используете 'complex ' для получения результата. Он будет иметь реальные и мнимые компоненты. – rpsml

+0

@ rpsml Вы совершенно правы, я добавлю – wvdz

Смежные вопросы