Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Stabilny algorytm rozwiązywania równania kwadratowego

Ostatnio zmodyfikowano 2015-02-12 08:40
Autor Wiadomość
do_matury
Temat założony przez niniejszego użytkownika
Stabilny algorytm rozwiązywania równania kwadratowego
» 2015-02-11 15:42:11
Witam,
mam pytanie dotyczące podanego algorytmu, mianowicie czym zasadniczo się różni od zwykłego "niestabilnego". Napisałem dwie wersje tego algorytmu i obje zwracają te same wyniki.
Schemat
Na tym schemacie wytłumaczona jest różnica pomiędzy wersjami algorytmów, lecz dla podanych tam wartości oba moje algorytmy zwracają tą samą wartość (a=0.001 b=-10 c=0.001). Czy może ktoś wytłumaczyć mi dlaczego tak się dzieje?
Poniżej zamieszczam dwie wersje algorytmu:

Wersja stabilna:
C/C++
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    double a, b, c, delta, x1, x2;
    cout << "Podaj wspolczynnik a rownania kwadratowego: ";
    cin >> a;
    cout << "Podaj wspolczynnik b rownania kwadratowego: ";
    cin >> b;
    cout << "Podaj wspolczynnik c rownania kwadratowego: ";
    cin >> c;
    delta = b * b -( 4 * a * c );
    if( delta < 0 )
    {
        cout << "Rownanie nie ma rozwiazania";
        return 0;
    }
    if( delta == 0 )
    {
        cout << "Rownanie ma jendo rozwiazanie ";
        cout << "x_0 = " <<- b /( 2 * a );
       
        return 0;
    }
    delta = sqrt( delta );
    if( b > 0 )
    {
        x1 =( - b - delta ) /( 2 * a );
        x2 = c /( a * x1 );
    }
    else
    {
        x2 =( - b + delta ) /( 2 * a );
        x1 = c /( a * x2 );
    }
    cout << "Rowanie ma dwa rozwiazania: ";
    cout << "x_1 = " << x1 << "   x_2 = " << x2;
    return 0;
}

Wersja niestabilna:

C/C++
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    double a, b, c, delta, x1, x2;
    cout << "Podaj wspolczynnik a rownania kwadratowego: ";
    cin >> a;
    cout << "Podaj wspolczynnik b rownania kwadratowego: ";
    cin >> b;
    cout << "Podaj wspolczynnik c rownania kwadratowego: ";
    cin >> c;
    delta = b * b -( 4 * a * c );
    if( delta < 0 )
    {
        cout << "Rownanie nie ma rozwiazania";
        return 0;
    }
    if( delta == 0 )
    {
        cout << "Rownanie nie ma jendo rozwiazanie ";
        x1 =- b /( 2 * a );
        cout << x1;
        return 0;
    }
    delta = sqrt( delta );
    x1 =( - b - delta ) /( 2 * a );
    x2 =( - b + delta ) /( 2 * a );
    cout << "Rowanie ma dwa rozwiazania: ";
    cout << "x_1 = " << x1 << "   x_2 = " << x2;
    return 0;
}
P-126345
Monika90
» 2015-02-11 16:37:09
Zwiększ precyzję wyświetlania, dodaj cout.precision(19); na początku main, to zobaczysz różnicę.
Możesz też uzyć innych danych, np. a=1e-20, b=-1, c=1e-20
P-126349
do_matury
Temat założony przez niniejszego użytkownika
» 2015-02-11 20:50:44
Ok, przy zwiększonej precyzji widać już różnicę. Dzięki za pomoc.
P-126376
aksen
» 2015-02-12 08:40:13
Brakuje tu sprawdzenia czy "a" jest różne od zera (obowiązkowe w tym przypadku)

Gdy a=0 to:
1. nie jest to równanie kwadratowe
2. w trakcie liczenia pierwiastków mamy dzielenie przez zero i program się wywala !!!
P-126412
« 1 »
  Strona 1 z 1