Trójmian kwadratowy

0

Zgodnie z poleceniem z książki Bjarne Stroustrupa miałem wykonać funkcję obliczającą deltę oraz pierwiastki trójmianu kwadratowego.

 #include "std_lib_facilities.h"

double delta(double a, double b, double c)
{
    double del=(b*b)+(-4*a*c);
    if (del<0)
        throw runtime_error("Delta mniejsza od zera!");
    else if (del==0){
        double x0=-b/(2*a);
        return x0;
    }
    else if (del>0){
    double x1=(-b-sqrt(del))/(2*a);
    return x1;
    }
}

int main()
try{
    cout<<"Program obliczajacy delte i pierwiastki z rownania kwadratowego."<<endl;
    cout<<"Podaj a, b oraz c rowniania ax^2+bx+c."<<endl;
    double a=0;
    double b=0;
    double c=0;
    cin>>a;
    cin>>b;
    cin>>c;
    double paucieka=delta(a, b, c);
    cout<<"Twoje rozwiazanie to: "<<paucieka<<'/n';
    return 0;
}
catch(runtime_error& e)
{
    cerr<<e.what()<<'\n';
    keep_window_open();
    return -1;
}

Póki co odpuściłem sobie obliczanie drugiego pierwiastka. Zamiast normalnego wyniku (np. dla a=1,b=4,c=-5 "x1" wynosiłoby -5) dostaję "-512142". Byłbym wdzięczny za wskazanie mi błędu.

0

A tak swoją drogą, to czy nie powinno się unikać warunków typu: double == 0.0 ? Poza tym powyższą konstrukcję można zastąpić:

 if (... > 0.0) {

} else if (... < 0.0) {

} else {

}

Cała kod w bloku try? Nie wiem, co ma przećwiczyć ten program, ale wydaje mi się, że delta mniejsza od zera, to nie powód, do rzucania wyjątku. No i masz funckcję, która nazywa się delta, a zwraca pierwiastek równania kwadratowego.

0

Pragnę tylko zauważyć, że gdy delta jest mniejsza od 0, to program powinien obliczyć pierwiastki zespolone, a nie rzucać wyjątkiem.

1
int trimialRoots(double a, double b, double c, double &outX1, double &outX2)
{
	static const double epsilon = std::numeric_limits<double>::epsilon();
	if (fabs(a) <= (fabs(b) + fabs(c)) * epsilon)
	{
		if (fabs(b) <= fabs(c) * epsilon)
		{
			return 0;
		}
		outX1 = -c / b;
		return 1;
	}
	double delta = b*b - 4*a*c;
	if (fabs(delta) <= 2 * (b*b + fabs(4*a*b)) * epsilon)
	{
		outX1 = - 0.5 * b / a;
		return 1;
	}
	else if (delta < 0)
	{
		return 0;
	}
	else
	{
		double  deltaSq = sqrt(delta);
		outX1 = - 0.5 * (b - deltaSq) / a;
		outX2 = - 0.5 * (b + deltaSq) / a;
		return 2;
	}
}

http://ideone.com/E8cWPH

0

Problem rozwiązał mi ktoś na innym forum. Błędem było "/" zamiast "" przed n. Aż się zdziwłem, że taki prosty błąd może zmienić wynik. Mimo wszystko dziękuję za chęć pomocy.

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