Cześć:)
Tak naprawdę to dopiero raczkuję w C++ a równań kwadratowych nie robiłem jeszcze na matematyce tak więc nie wiem czy wyniki mam dobre...prosiłbym Was o sprawdzenie tego programu:
Po co do podnoszenia do potęgi drugiej funkcja? b*b wystarczy. Poza tym taka funkcja już jest, nazywa się pow
Oba pierwiastki liczysz źle: http://pl.wikipedia.org/wiki/Funkcja_kwadratowa Dlaczego wypisujesz ich iloraz? :-/
Masz jakiś schemat blokowy na to? Bo widocznie ja mam w zeszycie z programowania zły...może źle przepisałem z tablicy albo coś..
Jaki schemat blokowy? Nie możesz po prostu kliknąć w link do Wikipedii i zastosować dwóch wzorów?
Tak moge ale porownujac wzory z ksiazki to ja mam je całkiem inne niz na wiki. Czyli tak jak mam w programie
jeżeli delta = 0 to -b/2a
Wzór na pierwiastek dwukrotny jest dobry, źle są wzory na dwa pierwiastki jeżeli delta > 0. Te na wiki są prawidłowe i takich uczą w szkole.
Ups.. mój błąd :D Nie zauważyłem dwóch znaków + i - we wzorze... przeoczyłem je na tablicy. Mój błąd...
x1 = -b-sqrt(delta)/2a;
x2 = -b+sqrt(delta)/sqrt(2a);
Teraz jest dobrze?
Tak wiem bez pierwiastka tam ma byc :P sorki
dalej jest źle, bo kolejność działań będzie nieprawidłowa. Licznik i mianownik weź w nawias.
Czy teraz program jest napisany dobrze?
matematycznie wygląda dobrze, ale liczb zmiennoprzecinkowych nie powinno się przyrównywać do zera
delta = bb - 4(a*c);
A teraz dobrze?
Zmieniłem float na int. Czy mógłby ktoś sprawdzić czy daje on poprawne wyniki?
To co mam dać...?
float nie bo zmienno przecinkowy być nie moze...double to samo.. int tez nie to co?
może, a nawet powinien być zmiennoprzecinkowy, tylko floatów nie przyrównuj do zera bo w większości przypadkó wyjdzie false, nawet jeśli liczby wydają się być takie same.
a żeby dostać piątkę z plusem, zamiast zwykłej, to liczyć należy nieco inaczej
http://www.matematyka.pl/106658.htm?sid=22684dfe469475f14d92a00ffea35706#p416161
Zmieniłem na double :)
Dzięki za ten link do matematyka.pl wezmę to pod uwagę podczas pisania drugiej wersji.
A żeby dostać 6 zamiast 5+ można nawet policzyć pierwiastki dla delta<0.
to jedziem dalej, a gdyby tak kwateriony... to 7?
Mały dowód, że porównywanie liczb zmiennoprzecinkowych jest zawodne, a język jest niekonsekwentny.
#include<iostream>
using namespace std;
int main()
{
float a=12345678.0f;
float b=12345679.0f;
float c=1.01233995f;
float p=(a+b+c)/2;
if(p==b)
cout<<"tak"<<endl;
else
cout<<"nie"<<endl;
if((a+b+c)/2==b)
cout<<"tak";
else
cout<<"nie";
return 0;
}
Imo, niekonsekwentne jest to, że a,b,c są typu float, natomiast (a+b+c)/2 jest typu double. W Javie (a+b+c)/2 jest też typu float i opisanej niżej anomalii nie ma.
Poniższe kody prowadzą do bardzo różnych wyników:
float a=...;
float b=...;
float c=...;
float p=(a+b+c)/2;
float result=(p-b)*b; //0
float a=...;
float b=...;
float c=...;
float result=((a+b+c)/2-b)*b; //76172.5