Dowolna potęga dowolnej liczby

Witam. Nie umiem stworzyć programu, który obliczał by dowolną potęgę dowolnej liczby. Prosiłbym o jakieś proste i zrozumiałe rozwiązanie.

W jakim programie chcesz to zrobić?

Ponieważ: x^y=(e^ln(x))^y = e^(ln(x)*y)

więc w pascalu funkcja taka miałaby postać:

function potega(const x,y : float) : float; 

begin 

potega := exp(ln(abs(x))*y); 

end;

W TP, a nie ma prosciejszego rozwiazania ?? :smiley:

Złączono Posta : 23.04.2007 (Pon) 8:06

chodzi mi o wyjasnienie co oznacza x,y,itd…

x, y - liczby rzeczywiste, x- podstawa potęgi, a y- wykładnik.

e-podstawa logarytmów naturalnych e=1,71…

ln(x)-symbol logarytmów naturalnych czyli o podstawie e.

abs - wartość bezwzględna liczby.

exp(x)-funkcja wykładnicza w pascalu czyli po prostu e^x


funkcja wykładnicza i logarytmiczna to funkcje odwrotne.

(Funkcjami odwrotnymi są też mnożenie i dzielenie czyli : x=x*a/a, dodawanie i odejmowanie czyli x=x+a-a)

czyli x=e^ln(x) i wobec tego:

x^y=(e^ln(x))^y i ostatecznie na podstawie twierdzenia o potędze potęgi:

x^y=e^(ln(x)*y) tak jak: (2^3)^2=2^(3*2)

W matematyce napiszemy :e^(ln(abs(x))*y) a w pascalu: exp(ln(abs(x))*y)

2.71… :wink:

zapis z eksponentem (exp) z matematycznego punktu widzenia jest również jak najbardziej prawidłowy :wink:

Czarny1990 , ta metoda jest chyba najprostsza (chociaż nie obliczy prawidłowo np. (-2)^3), jak Ci się nie podoba, to zawsze możesz próbować napisać jakąś pętlę, będzie to rozwiązanie troszkę dłuższe, ale pozbawione tego błędu, albo ewentualnie dopisać warunek do metody podanej przez floyda któy sprawdzał by czy wynik powinien być ujemny (musiał byś sprawdzić, czy x<0 i czy y%2=1 wówczas należało by dodać minus przed wynikiem)

Oczywiście, że 2.71…, a miałem napisać, że jest to granica funkcji f(x)=(1+1/x)^x gdy x–>oo i nie byłoby kłopotu :slight_smile:

Co do drugiej uwagi to też zgoda ale dla początkujących adeptów sztuki matematycznej zapis (exp) jest mniej znany i dlatego użyłem rozróżnienia tych dwóch zapisów.

Logarytmy istnieją tylko dla argumentów dodatnich dlatego we wzorze jest abs(x) aby uniknąć błędu. Prawdą jest, że dla x<=0 trzeba funkcję rozbudować o badanie tych warunków bo w takiej postaci jest on słuszny tylko dla x>0.

mi działa taki program (tez oblicza):

program liczymy_potega;

uses crt;

var liczba,licznik,potega,wynik:integer;

begin

clrscr;

writeln(‘Podaj liczbe’);

readln(liczba);

writeln(‘Podaj potege’);

readln(potega);

wynik:=1;

licznik:=0;

begin

repeat

wynik:=wynik*liczba;

licznik:=licznik+1;

until licznik=potega;

end;

writeln(wynik);

readln;

end.