Pierwiastek równania kwadratowego - prośba o sprawdzenie

0

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:

http://wklej.org/id/625389/

0

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? :-/

0

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ś..

0

Jaki schemat blokowy? Nie możesz po prostu kliknąć w link do Wikipedii i zastosować dwóch wzorów?

0

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

0

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.

0

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(2
a);
Teraz jest dobrze?

0

Tak wiem bez pierwiastka tam ma byc :P sorki

0

dalej jest źle, bo kolejność działań będzie nieprawidłowa. Licznik i mianownik weź w nawias.

0

Czy teraz program jest napisany dobrze?

http://wklej.org/id/625425/

0

matematycznie wygląda dobrze, ale liczb zmiennoprzecinkowych nie powinno się przyrównywać do zera

0

delta = bb - 4(a*c);

A teraz dobrze?

Zmieniłem float na int. Czy mógłby ktoś sprawdzić czy daje on poprawne wyniki?

0

To co mam dać...?
float nie bo zmienno przecinkowy być nie moze...double to samo.. int tez nie to co?

0

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.

0

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

0

Zmieniłem na double :)
Dzięki za ten link do matematyka.pl wezmę to pod uwagę podczas pisania drugiej wersji.

0

A żeby dostać 6 zamiast 5+ można nawet policzyć pierwiastki dla delta<0.

0

to jedziem dalej, a gdyby tak kwateriony... to 7?

0

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;
}
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

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