Potęga, logarytm, silnia,...

tomidze

Oczywiście, podstawą do napisania tych funkcji jest znajomość matematyki, ale z tym różnie bywa. Podam tutaj kilka wzorów, które są podstawowymi działaniami w matematyce, ale nie maja rozwiazania w TP w formie funkcji.
Artykuł przeznaczony raczej dla początkujacych !!


<font size="5" face="Georgia, Times New Roman, Times, serif">Potęgowanie xy</span>

1) Dla wykładnika (y) całkowitego można by napisać następujacą funkcję:
Function Potega(podst: Extended; wykl: Integer): Extended;
var i: Integer;
result: Extended;
begin
result := 1; {inicjacja zmiennej - MUSI BYĆ '1'}
for i := 1 to wykl do {np. 24=2*2*2*2}
result := result * podst;
Potega := result;
end;

2) Dla wykładnika (y) rzeczywistego można by napisać następujacą funkcję:
Function Potega(podst, wykl: Extended): Extended;
begin
{wykorzystujemy zalezność matematyczna xy=ey*ln(x)}
{i korzystamy ze standardowych funkcji EXP() i LN()}

if podst > 0 then Potega := Exp(wykl * Ln(podst))
else Potega := 0;
end;

<font size="5" face="Georgia, Times New Roman, Times, serif">Silnia n! </span><font size="5"></span><font size="-1">do góry</span>

1) iteracyjnie:
Function Silnia(value: Word): LongInt;
var i: Word;
result: LongInt;
begin
result := 1;
{Jeżeli value = 0 to pętla nie jest wykonywana - 0! = 1}
if value > 0 then
for i := 1 to value do
result := result * i;
Silnia := result;
end;

2) rekurencyjnie:
Function Silnia(value: Word): LongInt;
begin
Silnia := 1;
if value > 1 then Silnia := value * Silnia(value - 1);
end;

<font size="5" face="Georgia, Times New Roman, Times, serif">Logarytm dziesiętny log(n)</span> <font size="-1">do góry</span>

Oblicza wartość logarytmu dziesiętnego o podstawie podst liczby value. Wartości obydwu parametrów należy podać podczas wywoływania funkcji. W TP wyglądać może ona tak:
Function Logarytm(value, podst: Extended): Extended;
begin
{wykorzystujemy zależność loga(x)=ln(x)/ln(a)}
if (value > 0) and (podst < 1) and (podst > 0) then
Logarytm := Ln(value) / Ln(podst)
else {...}; {obsługa błędu}
end;

W Delphi taka funkcja może wyglądać następująco:
Function Logarytm(value: Extended; podst: Extended = 10): Extended;
begin
{wykorzystujemy zależność loga(x)=ln(x)/ln(a)}
if (value > 0) and (podst < 1) then
Logarytm := Ln(value) / Ln(podst)
else {...}; {obsługa błędu}
end;

Przy wywołaniu tej funkcji nie ma potrzeby podawania wartości podst, jeżeli należy obliczyć wartość logarytmu o podstawie 10 - jest to wartość domyślna.

<font size="5" face="Georgia, Times New Roman, Times, serif">Tangens tan(x) i Cotangens ctg(x)</span> <font size="-1">do góry</span>

Function Tan(value: Extended): Extended;
begin
Tan := Sin(value) / Cos(value);
end;

Function Ctg(value: Extended): Extended;
begin
Ctg := Cos(value) / Sin(value);
end;

13 komentarzy

dzieki chlopaki za poczebne funkcje teraz mozna je spokojnie wywolywac w swoich (Ctrl+c):D

function nwd(a,b:longint):longint;
var x,y:longint;
begin
x:=abs(a);
y:=abs(b);
while (x>0)and(y>0) do
if x>y then x:=x mod y;
else y:=y mod x;
nwd:=x+y;
end;

function fib(n:longint):longint;
var i,j,fib0,fib1:longint;
fib0:=0;
fib1:=1;
for i:=2 to n do
begin
j:=fib1;
fib1:=fib1+fib0;
fib0:=j;
end;
if (n>=0)and(n<2) then fib:=n;
if (n>1) then fib:=fib1;
end;

tkoomzaaskz dla ciebie

Dwukrotna silnie liczy sie tak :

function factdbl(n:word):extended;
var i:word;
x:extended;
begin
x:=1;
for i:=1 to n div 2 do
x:=x*(2*i+n mod 2);
factdbl:=x;
end;

a to jest ogolny algorytm na liczenie zadanej "warstwy" silni, czyli np n(!)^k, czyli
k=1 => !
k=2 => !!
k=3 => !!!
n=13,k=5 = (13)!!!!! = 1383 milej zabawy

function SuperSilnia(n,kr: longint):longint;
{Funkcja oblicza k-ta silnie, czyli dla k=1 zwykla silnia, dla k=2 !! dla k=3 !!! itp}
begin
if
n>kr
then
SuperSilnia:=SuperSilnia(n-kr,kr)*n
else
if
n=0
then
SuperSilnia:=1
else
SuperSilnia:=n
end;
// nie jestem tylko pewien, czy aby np 2!!!! = 2 czy 1 czy jakas inna wartosc. Ale to mozna zawsze skorygowac

A co do tego silnia-silnia: troche kiepski ten algorytm, bo przede wszystkim po co Ci w ogole zmienna tymczasowa? (2) skoro robisz samowywolanie, powinienes zrobic wariant "podstawowy" i ten, przy ktorym schodzisz w dol. TPonizsza wersja jest chyba latwiejsza i czytelniejsza, co?

function SS(licz: longint):longint;
begin
if
licz>1
then
SS:=SS(licz-2)*licz
else
SS:=1
end;

moglibyscie dodac wersje z while'em, wersje z autowywolywaniem sie;
mozecie zrobic obliczanie n-tego wyrazu ciagu Fibbonacciego (skoro matematyka), NWD (algorytm Euklidesa) i mase mase innych :). Jak sie potege, silnie, NWD i Fibo zczai w 5 wersjach to kazdy nastepny robi sie w minute :)

A oto funkcja obliczająca podówjną silnię:
{Made by Jacek Pintera}
function silnia_silnia(licz:byte):longint;
var
s:longint;
begin
s:=1;
if licz>1 then
s:=silnia_silnia(licz-2)*licz;
silnia_silnia:=s;
end;
{koniec}

mistrzu, w tym samym dziale znajduje się artykuł na ten sam temat - po co piszesz to samo po raz drugi?

Milka!!
Jeśli potrafisz czytać, to czytaj. Pisze wyraźnie:
<font color="#FF0000">Artykuł przeznaczony raczej dla początkujacych !!</span>
Jakbyś się wczytała dokładniej, to byś zauważyła, że Ln(wartość) liczy logarytm naturalny z podanej wartości. Nie istnieje natomiast w TP funkcja licząca logarytm dziesiętny!! Stąd moja wersja tej funkcji.

Kasioczek!!
Proszę, nie pisz więcej obciachowych komentarzy!! :)

dla posdtawówki (i mniej kumatej części gimnazjum) może być
bo trygonometria jest w gimnazjum; do obliczania logarytmów w TP służy o ile sie nie myle ln(wartość); silnia - jeżeli ktoś zna definicje to nie problem; potegowanie no to mogłeś sobie darować.
wskazówka może być ale zabrakło np.podwójnej silni n!! [cya]

No dobrze, juz nie powiem więcej "Tomaszku"

Tomaszku bardzo pięknie sie postarałeś:) A zdjęcie jest git:)

Dobry artykuł... można by go stopniowo rozwijać o nowe funkcje matematyczne...