rownanie kwadratowe [liczby zmiennoprzecinkowe]

0

witam

mam taki program:

#include<iostream>
#include<cstdlib>
#include<cmath>
#include <iomanip>
using namespace std;

int main()
{     
      double x1,x2;
      double a,b,c;
      double delta,p_delta,x,x1p,x2p;
      double blad_bez_x1,blad_wzgl_x1;
      double blad_bez_x2,blad_wzgl_x2;

            
    cout << "x1 = "; cin >> x1;
    cout << "x2 = "; cin >> x2;
      
      a=1;
      b=-x1-x2;
      c=x1*x2;
         
   delta = b*b-4*a*c;
  
   if(delta<0)  
      cout<<"Rownanie nie ma pierwiastkow"<<endl;             
       else
       {
         if(delta==0)
         {
          x=-b/(2*a);
          
          cout<<endl;    
          cout<<"Jeden pierwiastek: "<<x<<endl;
         }
          else 
          {    
              x1p=(-b-sqrt(delta))/(2*a);                
              x2p=(-b+sqrt(delta))/(2*a);
                                              
           cout<<endl;
           cout<<"x1': "<<x1p<<endl;
           cout<<"x2': "<<x2p<<endl;
                                                  
           blad_bez_x1=fabs(x1p-x1); 
           blad_bez_x2=fabs(x2p-x2);
        
           blad_wzgl_x1=(blad_bez_x1/x1)*100;  
           blad_wzgl_x2=(blad_bez_x2/x2)*100;  
                      
           cout<<endl;    
           cout.precision(0);
           cout<<"Blad wzgledny x1: "<<fixed<<blad_wzgl_x1<<" %"<<endl;  
           cout<<"Blad wzgledny x2: "<<fixed<<blad_wzgl_x2<<" %"<<endl; 
           }
        }  
             
cout<<endl;

    system("PAUSE");
    return 0;
}

użytkownik podaje pierwiastki i dalej program korzysta ze wzorów viete'a.
Na końcu program ma porównać otrzymane pierwiastki z tymi które podał użytkownik.
Przy liczbach zmiennoprzecinkowych już jest problem bo błąd względny może wynosić nawet 100%.
Jak do tego podejść?

0

Liczby zmiennoprzecinkowe to w takich przypadkach trochę kamikaze (inna kategoria przypadków to przechowywanie w takich liczbach wartości finansowych).
Moim zdaniem na początek musisz przemyśleć inny sposób reprezentacji/przechowywania swoich liczb. Choć na pewno ktoś poda dużo lepsze rozwiązanie, to zaproponuję: może dwie liczby całkowite, jedna reprezentująca część przed, a druga - po przecinku, w miejsce jednej zmiennoprzecinkowej liczby?

0

zgaduje, że masz problem, gdy podajesz pierwiastki w kolejności malejącej :P.

0

O co chodzi tutaj?

      a=1;
      b=-x1-x2;
      c=x1*x2;

Przecież a,b,c to powinny być stałe, niezależne od pierwiastków. Ale może czegoś nie rozumiem, albo te nazwy są jakieś mylące?

0

Nie rozumiesz. Program pyta o pierwiastki, znajduje odpowiednie równanie kwadratowe (z a=1), rozwiązuje je, i porównuje pierwiastki z rozwiązaniami równania.

0
/* Program: Pierwiastek rownania kwadratowego
Autor: Imie nazw
Zespol Szkol Technicznych Jakiśtam */

#include <iostream>
#include <cmath> // dla sqrt
#include <windows.h> // dla color
using namespace std;

void setColor(int color);

int main()
{
    double a,b,c,delta;
    double x0,x1,x2;

setColor(15);


    cout << "Demostracja algorytmu wyszukujacego pierwiastki rownania kwadratowego." << endl;
    cout << "-----------------------------------------------------------------------" << endl;
    cout << "(C) 2011 Imie nazwisko \t Zespol Szkol JakiśTam" << endl << endl;
    cout << "Podaj kolejno wspolczynniki: a, b i c:" << endl << endl;

    cout << "a = ";
    cin >> a;
    if(a==0)
        cout << "A musi byc wieksze od 0!" << endl;

        else

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

    cout << "-----------------------------------------------------------------------" << endl;
    cout << "WYNIKI: " << endl << endl;

           delta = b*b - 4*(a*c);

if(delta<0)
{
cout << "Brak pierwiastkow rzeczywistych." << endl;
}
    else if(delta==0)
    {

       x0 = -b /( 2 * a );
        cout << x0 << endl;
    }
            else
            {

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

            cout << "x1 = " << x1 << endl;
            cout << "x2 = " << x2 << endl;

            }
    cout << "-----------------------------------------------------------------------" << endl;
}

/************************************************************/
void setColor(int color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
 
0

Program ma działać tak jak powiedział bo czyli uzytkownik podaje pierwiastki a nie wspolczynniki.Na koncu program ma porownac otrzymane pierwiastki z tymi ktore podał uzytkownik.Program ma sobie poradzić z liczbami zmiennoprzecinkowymi.

0

Przecież dostałeś wskazówki.

    ...
    cout << "x1 = "; cin >> x1;
    cout << "x2 = "; cin >> x2;
    if(x1>x2)
    {
        double pom=x2;
        x2=x1;
        x1=pom;
        cout << "Zmieniam kolejnosc pierwiastkow" << endl;
        cout << "x1 = " << x1 << endl;
        cout << "x2 = " << x2 << endl;
    }
    ...
0
#include <cmath> // dla sqrt

standard zabrania komentarzy w linijce z include

1 użytkowników online, w tym zalogowanych: 0, gości: 1