Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Testowanie metody klasy - NaN

Ostatnio zmodyfikowano 2015-05-31 22:19
Autor Wiadomość
AndreaLishley
Temat założony przez niniejszego użytkownika
Testowanie metody klasy - NaN
» 2015-05-31 20:58:53
Napisałem sobie taką metodę obliczająca pierwiastek równania kwadratowego:

C/C++
double pierwiastek2()
{
    double delta = wsp_1 * wsp_1 - 4 * wsp_0 * wsp_2;
   
    if( delta < 0 )
    {
        return 0 / 0; // jest to wartosc NaN jesli dobrze rozumiem
    }
    else if( delta == 0 )
    {
        return( - 2 * wsp_0 /( wsp_1 ) );
    }
    else
    {
        return( 2 * wsp_0 /( - wsp_1 - sqrt( wsp_1 * wsp_1 - 4 * wsp_0 * wsp_2 ) ) );
    }
}

Do tego mam assert, którym chce sprawdzić czy dobrze działa ta metoda dla ujemnej delty

C/C++
assert( ts.pierwiastek2() == ???? );

I tu pojawia się pytanko, jak mam przetestować tę metodę? Co wstawić w assercie by działało elegancko? Nie wiem jaką inną wartość mógłbym zwrócić w przypadku ujemnej delty zamiast 0/0 i byłaby ona double'm. Jeśli ktoś ma jakiś lepszy pomysł chętnie spojrzę.
P-133032
Monika90
» 2015-05-31 21:24:56
Możesz zwracać NAN i testować za pomocą std::isnan(double)
P-133033
AndreaLishley
Temat założony przez niniejszego użytkownika
» 2015-05-31 21:34:58
Czyli tak?

C/C++
assert( std::isnan( tz.pierwiastek2() ) );

No dobrze to jeden sposób. Swoją drogą nawet o tym nie pomyślałem, bo zawsze testowałem właśnie w ten sposób, który opisałem. Dzięki.

A gdybym chciał zrobić to tak jak zapisałem czyli porównać do jakiegoś double'a?
P-133034
Monika90
» 2015-05-31 22:04:30
Właśnie tak, a w funkcji: return NAN; bo 0/0 to jest dzielenie całkowite. Mogłoby być 0/0. ale NAN ładniej wygląda.

A gdybym chciał zrobić to tak jak zapisałem czyli porównać do jakiegoś double'a?
NaN jest z wyglądu podobny zupełnie do niczego, czyli jest różny od samego siebie.
P-133035
pekfos
» 2015-05-31 22:06:07
C/C++
else if( delta == 0 )
{
    return( - 2 * wsp_0 /( wsp_1 ) );
}
else
{
    return( 2 * wsp_0 /( - wsp_1 - sqrt( wsp_1 * wsp_1 - 4 * wsp_0 * wsp_2 ) ) );
}
Po co te rozróżnienie? I tak zwracasz tylko jeden pierwiastek. Do tego pierwszy warunek prawie nigdy się nie spełnia, przez niedokładność obliczeń.
P-133036
AndreaLishley
Temat założony przez niniejszego użytkownika
» 2015-05-31 22:19:30
Racja, dzięki za odpowiedzi.
P-133037
« 1 »
  Strona 1 z 1