Obliczenia
Szczawik
Rodzaje obliczeń dokonywanych w Delphi na danych o typach liczbowych można podzielić na kilka kategorii, które są przedstawione poniżej. Skrócony opis wszystkich operatorów języka, nie tylko do operacji liczbowych, można znaleźć w poświęconym im opisie.
Operacje przypisania
Służą do określenia wartości danej. Poza bezpośrednim wpisem wartości do pamięci zajmowanej przez zmienną z wykorzystaniem jej adresu, standardową metodą przypisania jest użycie stosownego operatora, jak pokazano w przykładzie:
X := Y;
Działanie to należy interpretować jako "Y staje się wartością dla X" lub "X przybiera wartość Y", w odróżnieniu od "X jest równe Y". Ten drugi sposób interpretacji jest zarezerwowany dla logicznego operatora porównania, wyrażonego samym znakiem równości (bez dwukropka użytego w przypisaniu).
Operacje logiczne: bitowe
Służą do operowania daną jako zbiorem bitów. Każdy z bitów jest traktowany jako niezależna jednostka, a jego zmiana nie wpływa na inne bity danej.
Symbol operacji | Krótki opis | Przykład |
[[Delphi/not]] | Bitowa negacja | x:=not $FFFFFF00; {Wynik: x=255} |
[[Delphi/and]] | Bitowy iloczyn logiczny | x:=3 and 6; {Wynik: x=2} |
[[Delphi/or]] | Bitowa suma logiczna | x:=3 or 6; {Wynik: x=7} |
[[Delphi/xor]] | Bitowa alternatywa wykluczająca | x:=3 xor 6; {Wynik: x=5} |
[[Delphi/shl]] | Bitowe przesunięcie w lewo | x:=3 shl 2; {Wynik: x=12} |
[[Delphi/shr]] | Bitowe przesunięcie w prawo | x:=12 shr 2; {Wynik: x=3} |
Operacje logiczne: porównania
Służą do sprawdzania, czy dany warunek jest spełniony, czy też nie. Są one specjalnym rodzajem operacji logicznych, gdyż operują na danych, ale zwracają wartości logiczne. Dozwolone działania porównań przedstawia poniższa tabela:
Symbol operacji | Symbol klasyczny | Krótki opis | Przykład |
= | = | Równe | B:=(1=1); {TRUE} |
? | Różne | B:=(1<-1); {TRUE} | |
< | < | Mniejsze | B:=(-1<1); {TRUE} |
<= | ? | Mniejsze lub równe | B:=(-1<=1); {TRUE} |
> | > | Większe | B:=(1>-1); {TRUE} |
>= | ? | Większe lub równe | B:=(1>=-1); {TRUE} |
Operacje artymetyczne: proste
Służą do operowania daną jako określoną wartością, za pomocą operatorów języka.
Symbol operacji | Krótki opis | Przykład |
+ | Dodawanie | x:=1+2.3; {Wynik: x=3.3} |
- | Odejmowanie | x:=1-2.3; {Wynik: x=-1.3} |
* | Mnożenie | x:=2*3.4; {Wynik: x=6.8} |
[[Delphi/div]] | Dzielenie całkowitoliczbowe | x:=5 div 3; {Wynik: x=1} |
[[Delphi/mod]] | Reszta z dzielenia całkowitoliczbowego | x:=5 mod 3; {Wynik: x=2} |
/ | Dzielenie | x:=7 / 2; {Wynik: x=3.5} |
Operacje artymetyczne: funkcyjne
Służą do operowania daną jako określoną wartością, za pomocą funkcji zaimplementowanych w bibliotekach. Podstawowe operacje są umieszczone poniżej:
Funkcja | Krótki opis | Przykład zapisu |
[[Delphi/Inc]] | Inkrementacja (zwiększenie o 1 albo o N) | Inc(X); Inc(X,N); |
[[Delphi/Dec]] | Dekrementacja (zmniejszenie o 1 albo o N) | Dec(X); Dec(X,N); |
[[Delphi/Abs]] | Wartość bezwzględna | Abs(X); |
[[Delphi/Int]] | Część całkowita liczby rzeczywistej | Int(X); |
[[Delphi/Frac]] | Część ułamkowa liczby rzeczywistej | Frac(X); |
[[Delphi/Sqr]] | Potęga drugiego stopnia | Sqr(X); |
[[Delphi/Sqrt]] | Pierwiastkowanie drugiego stopnia | Sqrt(X); |
[[Delphi/Power]] | Potęga dowolnego stopnia rzeczywistego | Power(X, Y); |
[[Delphi/Ln]] | Logarytm naturalny | Ln(X); |
[[Delphi/LnXP1]] | Logarytm naturalny dla X+1 (szybsza niż dodawanie osobno) | LnXP1(X); |
[[Delphi/Log2]] | Logarytm dwójkowy | Log2(X); |
[[Delphi/Log10]] | Logarytm dziesiętny | Log10(X); |
[[Delphi/LogN]] | Logarytm o wybranej podstawie B | LogN(B, X); |
[[Delphi/Exp]] | Liczba e podniesiona do określonej potęgi | Exp(X); |
[[Delphi/Ldexp]] | Liczba X*2P | Ldexp(X,P); |
[[Delphi/Hi]] | Starszy bajt 16 bitowego słowa | Hi(X); |
[[Delphi/Lo]] | Młodszy bajt 16 bitowego słowa | Lo(X); |
[[Delphi/Sign]] | Wartość zależna od znaku argumentu (-1 dla X<0, 0 dla X=0, 1 dla X>0) | Sign(X); |
[[Delphi/Round]] | Zaokrąglenie matematyczne | Round(X); |
[[Delphi/Trunc]] | Przekształcenie liczby rzeczywistej na całkowitą | Trunc(X); |
[[Delphi/Floor]] | Zaokrąglenie w dół | Floor(X); |
[[Delphi/Ceil]] | Zaokrąglenie w górę | Ceil(X); |
[[Delphi/Max]] | Z pośród dwóch podanych liczb zwraca większą | Max(X, Y); |
[[Delphi/Min]] | Z pośród dwóch podanych liczb zwraca mniejszą | Min(X, Y); |
[[Delphi/MaxValue]] | Z pośród tablicy liczb zwraca największą | MaxValue(array); |
[[Delphi/MinValue]] | Z pośród tablicy liczb zwraca najmniejszą | MinValue(array); |
[[Delphi/MaxIntValue]] | Z pośród tablicy całkowitych liczb zwraca największą | MaxIntValue(array); |
[[Delphi/MinIntValue]] | Z pośród tablicy całkowitych liczb zwraca najmniejszą | MinIntValue(array); |
Do operacji funkcyjnych zaliczają się również wszystkie dostępne w Delphi operacje działań trygonometrycznych.
Operacje złożone
Służą do wyrażania wartości za pomocą wielu działań dokonywanych na wielu danych. Przykłady poniżej:
var
A, B, C : Integer;
X, Y, Z : Extended;
S : Boolean;
begin
A := 10;
B := -20;
C := 30;
X := 1.3;
Y := -2.4;
Z := 3.5;
A := A + B * C; {A = -590}
B := Round(X * Y); {B = -3}
C := Floor(Sign(X) * Sqrt(Z)); {C = 1}
X := A / Z - B / Y; {X ? -169,821}
Y := Sqr(X) * Sin(X) * C; {Y ? -5033,237}
Z := Exp(A + B) * (not B) / X; {Z ? 6,984}
S := not ((A and 0) <> (B and 1)); {S = FALSE}
end;
Przy definiowaniu takich obliczeń należy pamiętać o priorytetach działań obowiązujących w Delphi. Przedstawione są one w poniższej tabeli:
Priorytet | Operacje |
Zerowy (najwyższy) | Operacje funkcyjne |
Dodatkowy | Nawiasy łączące działania: ( ) |
Pierwszy | @, [[Delphi/not]] |
Drugi | *, /, [[Delphi/div]], [[Delphi/mod]], [[Delphi/and]], [[Delphi/shl]], [[Delphi/shr]], [[Delphi/as]] |
Trzeci | +, -, [[Delphi/or]], [[Delphi/xor]] |
Czwarty (najniższy) | =, <, <, >, <=, >=, [[Delphi/in]], [[Delphi/is]] |
Delphi posiada specjalną funkcję Power do obliczania potęg. Przy jej wykorzystaniu można też wyliczyć pierwiastki dowolnego stopnia, korzystając z zależności, że pierwiastek z X stopnia Y, to X do potęgi 1/Y. Do takiego wyliczenia można wykorzystać również poniższy kod - proste złożenia funkcji:
function Potega(X, Y:Extended):Extended;
begin
Result := Exp(ln(X)*Y);
end;
function Pierwiastek(X, Y: Extended): Extended;
begin
Result := Exp(ln(X)/Y);
end;
W rzeczywistości funkcja Power dokonuje właśnie takiego wyliczenia, uprzednio sprawdzając jeszcze dodatkowe warunki.
Operacje mnogościowe zbiorów
Są szczególnym przypadkiem operacji liczbowych, w których daną może być cały zbiór liczb, a nie tylko pojedyncza wartość. Szczegółowy opis tych operacji można znaleźć przy opisie słowa kluczowego Set, służącego do deklarowania zbioru.
Operacje konwersji
Służą do zamiany jednego systemu miar na inny oraz konwersji typu liczbowego na inny. Podstawowe operacje konwersji miar można znaleźć przy opisie operacji trygonometrycznych.