Program obliczający pierwiastek trzeciego stopnia


(matiit) #1

Jako, że pierwiastek trzeciego stopnia z a, to a^(1/3) to napisałem to tak:

#include 

#include 

using namespace std;

int main()

{

	double a;

                cout << "Podaj liczbę\n";

	cin >> a;

	  double tmp;

	  tmp=1/3;

        double wynik;

          wynik=(double) pow(a, tmp);

	        cout << wynik;

}

Niestety program nie działa:

Podaj liczbę

8

Widzi ktoś może błąd?


(Krakers87) #2

"cout << b;" < co to ma być niby? :wink:


(matiit) #3

Bo zanim dałem tu kod programu to zmienna wynik to bylo b, tylko tu zmieniłem, żeby było ładniej :slight_smile:

Już poprawiam


(Starkowski Dawid) #4
  1. Bardzo nieczytelnie formatujesz tekst.

  2. Nie musisz rzutować na (double) bo pow() zwraca taki typ jaki przyjmuje (float, double, long double)

3.

tmp = 1/3

Takie przypisanie nie da Ci dokładnie ułamka, więc podnosisz a do potęgi 0.333333333333

Może przez to nie działa?


(Krakers87) #5
wynik = exp(log(a)/(tmp));

tmp w tym przypadku ma być 3 :slight_smile: W sposobie, który ty podałeś tmp musi mieć wartość liczbową, czyli w tym przypadku 0.33(3) co wiąże się z niedokładnością. Np tmp=0.25 nie ma takiego problemu.


(matiit) #6

Tak działa, mógłbyś owiedzieć co tu się dokładnie zmieniło bo nie czaję do końca...

Chodzi mi szczególnie o argumenty przekazywane do funkcji exp.


(Sawyer47) #7

matiit, twój kod nie działał przez tę linijkę:

double tmp = 1/3; // pozwoliłem sobie połączyć 2 w 1

1/3 w C++ daje 0, bo w działąniu operujesz tylko na liczbach całkowitych. Musiałbyś zmienić to na 1.0/3.0, wtedy zmienna tmp miałaby wartość 0.333... i dla 8.0 dostaniesz wynik 2.0.

To co podał krakers09 to wynika z własności logarytmu, nie wiem czy jest bardziej dokładne, być może, a być może jest równie niedokładne.

exp(x) to e^x (e podniesione do x'ej potęgi)

log(x) to logarytm o podstawie e z liczby x (log_e(x))

Ogółem A^(log_A(x)) daje x.

Poza tym log_a(x^n) to n * log_a(x).

Składając to wszystko wynika, że to exp(log(a)/(tmp)) to po prostu a^(1/tmp) :slight_smile:


(Krakers87) #8

Bądź też zapisać to jako:

tmp = (double) 1/3;

(matiit) #9

Dobra teraz rozumiem, wielkie dzięki


(Airborn) #10

wiem, że przypadek jest ekstremalny, i pewnie nikt nie będzie go nigdy obliczał, ale metoda zaproponowana przez krakers09 , ma jeden podstawowy błąd, ze względu na dziedzinę logarytmu, nie da się obliczyć pierwiastka liczb niedodatnich, pewnie dało by się to jakoś rozwiązać korzystając z abs(), ale w cmath nie ma chyba funkcji signum() więc jakaś jej prosta implementacja

int sgn(int num) {

	if (num > 0) return(1);

	else if (num < 0) return(-1);

	else return(0);

}

(matiit) #11

Zbaczyłem że wystarczy tmp=1.0/3, dzięki temu można bez problemu napisać funkcję obliczającą pierwiastek dowolnego stopnia:

long double DowolnyPierwiastek(double podstawa, double x)

{

	long double wynik;

	long double tmp=1.0/x;

wynik=pow(podstawa, tmp);

return wynik;

}

Dziękuję wszystkim.

Teraz tylko napisać to w J2ME i będę to miał na telefonie :slight_smile: