Stabilny algorytm rozwiązywania równania kwadratowego
Ostatnio zmodyfikowano 2015-02-12 08:40
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. SchematNa 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: #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: #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; }
|
|
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 |
|
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. |
|
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 !!! |
|
« 1 » |