rgv475 Temat założony przez niniejszego użytkownika |
Dziwny wynik "nan" » 2012-09-29 21:30:32 Dobry wieczór ;). Mam problem z programem i bardzo bym Was prosił o naprowadzenie co źle robię, że wychodzą takie wyniki. Program oblicza równania kwadratowe, niestety (czasem - nie zawsze) wyniki miejsc zerowych wylicza mi "nan" (np. gdy wpiszę a:4, b:5, c:6). Poniżej moje wypociny.:P Pozdrawiam. #include <iostream> #include <ctime> #include <cstdlib> #include <conio.h> #include <cmath> #include <string>
double fA; double fB; double fC; double delta( double a, double b, double c ) { double dDelta; dDelta = fB * fB - 4 * fA * fC; return dDelta; }
int main() { std::cout << "Podaj wspolczynnik a: "; std::cin >> fA; std::cout << "Podaj wspolczynnik b: "; std::cin >> fB; std::cout << "Podaj wspolczynnik c: "; std::cin >> fC; if( fA == 0 ) { std::cout << "Brak rozwiazan. A nie moze byc rowne 0." << std::endl; } delta( fA, fB, fC ); if( delta < 0 && fA != 0 ) { std::cout << "Brak miejsc zerowych" << std::endl; getch(); } if( delta == 0 && fA != 0 ) { double fMZ1; fMZ1 = - fB /( 2 * fA ); std::cout << "Funkcja ma jedno miejsce zerowe: " << fMZ1 << std::endl; } if( delta > 0 && fA != 0 ) { double fMZ1; double fMZ2; delta( fA, fB, fC ); fMZ1 =( - fB -( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); fMZ2 =( - fB +( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); std::cout << "Funkcja ma 2 miejsca zerowe: " << fMZ1 << ", " << fMZ2 << std::endl; } getch(); } |
|
OSA_PL |
» 2012-09-29 22:00:38 Po co przyjmujesz parametry do funkcji jak ich w ogóle nie używasz?: double delta( double a, double b, double c ) { double dDelta; dDelta = fB * fB - 4 * fA * fC; return dDelta; }
delta( fA, fB, fC ); - i co to ma niby robić? Tu też coś masz pokićkane co ma oznaczać to delta? if( delta < 0 && fA != 0 ) { std::cout << "Brak miejsc zerowych" << std::endl; getch(); } Chyba musisz sobie powtórzyć funkcje. |
|
rgv475 Temat założony przez niniejszego użytkownika |
» 2012-09-29 22:20:01 Hm, delta jest potrzebna do obliczenia miejsc zerowych. ( Nie rozumiem Twojego pytania do czego ta delta ) Jeżeli chodzi ci o to: if( delta > 0 && fA != 0 ) { double fMZ1; double fMZ2; delta( fA, fB, fC ); fMZ1 =( - fB -( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); fMZ2 =( - fB +( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); std::cout << "Funkcja ma 2 miejsca zerowe: " << fMZ1 << ", " << fMZ2 << std::endl; } To racja, nie wiem po co ją tam wpisałem ;) Dręczy mnie problem czemu wynikiem miejsc zerowych jest "nan". Czyżbym źle równanie złożył obliczania miejsc zerowych? (wątpię) Jeśli ktoś wie w czym problem to proszę o pomoc jak mu zaradzić. ps. Proszę o wyrozumiałość, uczę się tego 2 dni.:P Pozdrawiam. |
|
Admixior |
» 2012-09-29 22:26:20 delta( fA, fB, fC ); if( delta < 0 && fA != 0 )
dobrze zadał pytanie; przyjrzyj się tym linijkom i odpowiedz czy to funkcja czy zmienna PS napoczątku sprawdzasz czy fA==0 to po co później w każdym ifie sprawdzasz to samo Przydatny link: http://pl.wikipedia.org/wiki/NaN |
|
rgv475 Temat założony przez niniejszego użytkownika |
» 2012-09-29 22:37:39 No przecież! :D Ale ze mnie gapa, przecież to zmienna była. Dlatego właśnie sprawdzałem czy a != 0... Ok kod poprawiłem, wszystko śmiga. #include <iostream> #include <ctime> #include <cstdlib> #include <conio.h> #include <cmath> #include <string>
double fA; double fB; double fC; double delta( double a, double b, double c ) { double dDelta; dDelta = fB * fB - 4 * fA * fC; return dDelta; }
int main() { std::cout << "Podaj wspolczynnik a: "; std::cin >> fA; std::cout << "Podaj wspolczynnik b: "; std::cin >> fB; std::cout << "Podaj wspolczynnik c: "; std::cin >> fC; if( fA == 0 ) { std::cout << "Brak rozwiazan. A nie moze byc rowne 0." << std::endl; } delta( fA, fB, fC ); if( delta( fA, fB, fC ) < 0 ) { std::cout << "Delta = " << delta( fA, fB, fC ) << std::endl; std::cout << "Brak miejsc zerowych" << std::endl; getch(); } if( delta( fA, fB, fC ) == 0 ) { double fMZ1; fMZ1 = - fB /( 2 * fA ); std::cout << "Delta = " << delta( fA, fB, fC ) << std::endl; std::cout << "Funkcja ma jedno miejsce zerowe: " << fMZ1 << std::endl; } if( delta( fA, fB, fC ) > 0 ) { double fMZ1; double fMZ2; std::cout << "Delta = " << delta( fA, fB, fC ) << std::endl; fMZ1 =( - fB -( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); fMZ2 =( - fB +( sqrt( delta( fA, fB, fC ) ) ) ) /( 2 * fA ); std::cout << "Funkcja ma 2 miejsca zerowe: " << fMZ1 << ", " << fMZ2 << std::endl; } getch(); } Dzięki Wam. ;) Pozdrawiam. |
|
OSA_PL |
» 2012-09-29 22:45:52 Wpisz jako a 0 ( Program przy obliczaniu miejsc zerowych będzie dzielił przez zero, czego nie powinien robić ) |
|
Admixior |
» 2012-09-29 22:48:25 Zapomniałeś przerwać program w if-ie fA==0 ;] |
|
rgv475 Temat założony przez niniejszego użytkownika |
» 2012-09-29 22:51:19 Racja, poprawiłem: if( delta( fA, fB, fC ) > 0 && fA != 0 ) Teraz chyba wszystko jest ok. Poprawiłem aby sprawdzało, ponieważ jeszcze nie wiem jak zamykać program. |
|
« 1 » |