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

[C++] Pierwiastkowanie - dziwne zachowanie programu

Ostatnio zmodyfikowano 2013-02-28 16:30
Autor Wiadomość
Berux
Temat założony przez niniejszego użytkownika
[C++] Pierwiastkowanie - dziwne zachowanie programu
» 2013-02-27 20:32:10
Witam. Wiem, że może się wam to wydać dość dziwne, że piszę program obliczający pierwiastek bez użycia przeznaczonej do tego funkcji. Jednak myślę, że jest to dobre ćwiczenie. Program zachowuje się dość dziwnie. Oto kod:

C/C++
#include <iostream>

using namespace std;

int main()
{
    double wynik;
    cout << "Podaj liczbe, ktorej pierwiastek chcesz obliczyc: ";
    double liczba;
    cin >> liczba;
   
    cout << "Podaj stopien pierwiastka: ";
    int stopien;
    cin >> stopien;
   
    for( double i = 0.001;; i += 0.001 )
    {
        wynik = i;
        cout << wynik << endl; //tutaj sobie sprawdzalem dlaczego sa bledy
       
        for( int j = 2; j <= stopien; j++ )
        {
            wynik *= i;
        }
       
        if( wynik == liczba )
        {
            cout << wynik;
            break;
        }
       
        if( wynik < liczba )
             continue;
       
        if( wynik > liczba )
        {
            i -= 0.001;
            wynik = i;
            for( int j = 2; j <= stopien; j++ )
            {
                wynik *= i;
            }
            cout << wynik;
            break;
        }
    }
    return 0;
}

Program się kompiluje, jednak po wpisaniu np. w pierwszym wczytywaniu: 100, a w drugim 2 (czyli pierwiastek kwadratowy ze stu), to do pewnego momentu program zachowuje się dobrze:


...
9.996
9.997
9.998
9.999
10
10.1
i za chwile ponownie wypisuję zmienną wynik, a tu:
100

Trochę dziwny problem. Proszę o pomoc i z góry dziękuję :)

/edit:
Jeśli coś źle wytłumaczyłem, to proszę, o samodzielne sprawdzenie kodu w swoim IDE ;) Na IDEONE działa tak samo jak u mnie.
P-77251
Monika90
» 2013-02-27 22:07:39
Pominę fakt, że pierwiastki oblicza się w inny sposób...

Sprawdzanie
if( wynik == liczba )
 możesz sobie darować, bo prawie nigdy nie będa sobie równe, dodaj
cout.precision( 17 );
 na początku
main
, to zrozumiesz.

Zatem, prędzej czy później sterowanie trafi do tego fragmentu:
C/C++
if( wynik > liczba )
{
    i -= 0.001;
    wynik = i;
    for( int j = 2; j <= stopien; j++ )
    {
        wynik *= i;
    }
    cout << '!' << wynik;
    break;
}
gdzie
i
 jest równe prawie 10, podnosisz je do kwadratu, więc wychodzi prawie 100, które jest drukowane, następnie
break
 przerywa pętlę i program się kończy.
P-77266
Chlorek
» 2013-02-27 22:14:16
Jak zobaczyłem jak działa ten kod to od razu pomyślałem, że to nie ma prawa dobrze działać. Generalnie pierwiastki nawet "we własny sposób" liczy się inaczej, jeszcze liczba typu 100 to dobra liczba, ale bardzo wiele innych może Cię zawieść... Co do problemu, jakoś mam ciężką głowę teraz i nie mogę za bardzo rozgryźć gdzie jest błąd. Ale odpowiedź użytkownika Monika90 zdaje się być poprawna. Podnosisz tam liczbę to potęgi, jakoś to wszystko tak dziwnie wygląda...
P-77268
usmiech
» 2013-02-28 01:31:20
Warto nauczyc sie debugging :)
P-77288
Berux
Temat założony przez niniejszego użytkownika
» 2013-02-28 15:29:26
Jeśli chodzi o uwagi, to nie miałem jeszcze w szkole pierwiastków, więc nie wiem jak się je oblicza :( Proszę o wyrozumiałość :)

@up
Może z debugowaniem nie jest taki zły pomysł. Wolałbym jednak najpierw przeczytać symfonie ;)
P-77306
kubawal
» 2013-02-28 16:30:32
P-77314
« 1 »
  Strona 1 z 1