Potęga, logarytm, silnia,...

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 !!





Potęgowanie  xy


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;

Silnia n! do   góry


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;

Logarytm  dziesiętny log(n) do  góry


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.

Tangens  tan(x) i Cotangens ctg(x) do  góry


Function Tan(value:  Extended): Extended;

begin

Tan := Sin(value) / Cos(value);

end;


Function Ctg(value:  Extended): Extended;

begin

Ctg := Cos(value) / Sin(value);

 end;
Informacje
Ostatnia modyfikacja 04-09-2003 01:21 Ostatni autor tomidze
Ilość wyświetleń 47243 Wersja 1
Komentarz
opex14 dnia 03-09-2006 22:29
dzieki chlopaki za poczebne funkcje teraz mozna je spokojnie wywolywac w swoich (Ctrl+c):D
nowy121105 dnia 24-07-2006 01:01
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
nowy121105 dnia 24-07-2006 00:25
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;
tkoomzaaskz dnia 06-02-2006 15:50
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)!!!!! = 13*8*3 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
tkoomzaaskz dnia 06-02-2006 15:27
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;
tkoomzaaskz dnia 06-02-2006 15:21
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 :)
jacek_beny dnia 09-10-2004 13:08
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}
ŁF dnia 05-10-2003 23:29
mistrzu, w tym samym dziale znajduje się artykuł na ten sam temat - po co piszesz to samo po raz drugi?
tomidze dnia 07-09-2003 14:09
Milka!!
Jeśli potrafisz czytać, to czytaj. Pisze wyraźnie:
Artykuł przeznaczony raczej dla początkujacych !!
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!! :)
AklimX dnia 05-09-2003 14:14
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]
Kasioczek dnia 04-09-2003 16:33
No dobrze, juz nie powiem więcej "Tomaszku"
Kasioczek dnia 04-09-2003 16:32
Tomaszku bardzo pięknie sie postarałeś:) A zdjęcie jest git:)
Deti dnia 04-09-2003 09:22
Dobry artykuł... można by go stopniowo rozwijać o nowe funkcje matematyczne...

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0286 sek. (zapytań SQL: 9)