Выход калькулятора уравнения второй степени получен - PullRequest
0 голосов
/ 02 мая 2019

Следующий код должен считывать 3 коэффициента уравнения 2-й степени и выводить дискриминант и решения (если они есть), аналогичные этому онлайн-калькулятору: https://calculator.tutorvista.com/math/496/2nd-degree-equation-calculator.html Но по некоторым причинам мой калькулятор, похоже, дает некоторые результаты правильно, но не в большинстве случаев.

#include <iostream>
#include <math.h>

using namespace std;

int main() {

    float a, b, c;

    cout << "a=" << endl;
    cin >> a;
    cout << "b=" << endl;
    cin >> b;
    cout << "c=" << endl;
    cin >> c;

    float delta = (pow(b, 2)) - (4 * a*c);
    float summit = (-b) / (2 * a);
    float x1 = (-(b) + (sqrt(delta)) / (2 * a));
    float x2 = (-(b) - (sqrt(delta)) / (2 *a));



    cout <<"Discriminant="<< delta << endl;

    if (delta < 0) {
        cout << "No solution" << endl;
    }
    else if (delta == 0) {
        cout << "Unique solution is:" << summit << endl;

    }
    else {
        cout << "First solution is:" << x1 << endl;
        cout << "Second solution is:" << x2 << endl;

    }
    std::cin.ignore();
    std::cin.get();
}

Вот несколько редких примеров ввода, в которых мой калькулятор работает по назначению в соответствии с онлайн-калькулятором, указанным выше:

а = 3; б = 1; с = 24;

а = 1, б = 0; с = 0;

а = 1, б = -4; с = 4;

Но не всегда все идет так гладко, например, ввод 1; 4; -12 дает вам 8 и 0, а не 6 и -2 (обратите внимание, что результаты отклоняются на 2), в других случаях один из решения будут правильными, а другие - нет, и в большинстве случаев результаты полностью выключены.

Я не совсем уверен, связана ли проблема с дискриминантом или решением, потому что иногда первое будет правильным, а второе - нет.

Существует ли определенный этикет, когда речь идет о написании математических формул на C ++, о котором я не знаю?

Заранее спасибо.

1 Ответ

4 голосов
/ 02 мая 2019

формула (-b + - sqrt (D)) / 2a,

, но вы вычисляете -b + - sqrt (D) / 2a,

, потому что деление имеет приоритет над сложением/ substruction, поэтому ваши строки

float x1 = (-(b) + (sqrt(delta)) / (2 * a) );
float x2 = (-(b) - (sqrt(delta)) / (2 * a) );

должны быть

float x1 = (-(b) + sqrt(delta)) / (2 * a);
float x2 = (-(b) - sqrt(delta)) / (2 * a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...