AutoIt/Funkcje matematyczne

Funkcje matematyczne

edytuj

AutoIt, podobnie jak większość języków programowania, zawiera pewną ilość zdefiniowanych funkcji do przeprowadzania obliczeń matematycznych. Zestaw ten nie jest specjalnie rozbudowany i zawiera tylko podstawowe, najczęściej używane funkcje.

Dostępne funkcje matematyczne można podzielić na:

- funkcje arytmetyczne

- funkcje logiczne (bitowe)

Ponadto na końcu rozdziału znajduje się kilka przydatnych funkcji nie będących sensu stricto funkcjami matematycznymi, ale o podobnym zastosowaniu.

Umieściłem tam także podstawowe informacje o szesnastkowym (heksadecymalnym) zapisie liczb, powszechnie używanym w praktyce programistycznej.


Funkcje arytmetyczne

edytuj

Wartość bezwzględna

edytuj
Abs ( wyrażenie )

Funkcja zwraca wartość bezwzględną z wyrażenia argumentu. Jeżeli argument jest stringiem to zwracane jest 0.


Funkcja sinus

edytuj
Sin ( wyrażenie )

Funkcja zwraca wartość sinusa kąta. Kąt należy podawać w radianach.

Dla przypomnienia 1° = Π / 180 radianów, kąt_w Radianach = kąt_w_stopniach * Π / 180.


Funkcja cosinus

edytuj
Cos ( wyrażenie )

Funkcja zwraca wartość cosinusa kąta. Kąt należy podawać w radianach.


Funkcja tangens

edytuj
Tan ( wyrażenie )

UWAGA: Funkcja tangens jest nieokreślona dla wartości ... -3*Π/2, - Π/2, Π/2, 3*Π/2, 5*Π/2,.., ponieważ zawsze operujemy przybliżonymi wartościami liczby Π, możemy uzyskiwać dla tych argumentów nieprawdziwy wynik w postaci np. 1.63317787283838e+016.


Funkcja arcus sinus

edytuj
ASin ( wyrażenie )

Funkcja zwraca wartość arcusa sinusa argumentu. Wynik jest w radianach.

Wyrażenie będące argumentem musi mieć wartość z przedziału <-1, 1>. W przeciwnym razie funkcja zwróci -1.#IND, co oznacza, że wynik jest nieokreślony.


Funkcja arcus cosinus

edytuj
ACos ( wyrażenie )

Funkcja zwraca wartość arcusa cosinusa argumentu. Wynik jest w radianach.

Wyrażenie będące argumentem musi mieć wartość z przedziału <-1, 1>. W przeciwnym razie funkcja zwróci -1.#IND, co oznacza, że wynik jest nieokreślony.


Funkcja arcus tangens

edytuj
ATan ( wyrażenie )

Funkcja zwraca wartość arcusa tangensa argumentu. Wynik jest w radianach.


Funkcja ex

edytuj
Exp ( wyrażenie )

Funkcja zwraca liczbę e podniesioną do potęgi argumentu.


Funkcja logarytm naturalny

edytuj
Log ( wyrażenie )

Funkcja zwraca logarytm naturalny z argumentu. Argument musi być liczbą dodatnią, w przeciwnym razie funkcja zwróci -1.#IND, co oznacza, że wynik jest nieokreślony.

Dla przypomnienia logarytm dziesiętny można wyliczyć ze wzoru: Log10 = Log(x) / Log(10).


Funkcja pierwiastek kwadratowy

edytuj
Sqrt ( wyrażenie )

Funkcja zwraca pierwiastek kwadratowy z argumentu. Argument musi być liczbą nieujemną, w przeciwnym razie funkcja zwróci -1.#IND, co oznacza, że wynik jest nieokreślony.


Reszta z dzielenia

edytuj
Mod ( wyr1, wyr2 )

Funkcja zwraca resztę z dzielenia argumentów wyr1 przez wyr2. Jeżeli wyr2 jest równe 0 to funkcja zwróci -1.#IND, co oznacza, że wynik jest nieokreślony.

Przykład:

$rzd1 = Mod(10, 4)   ;wynik 2
$rzd2 = Mod(10, 2)   ;wynik 0


Zaokrąglanie liczby

edytuj
Round ( wyrażenie, [ ilość_miejsc_po_przecinku ] )

Funkcja zwraca liczbę zaokrągloną do zadanej ilości miejsc po przecinku. Jeżeli parametr ilość_miejsc_po_przecinku pominiemy, to zaokrąglenie będzie do liczby całkowitej.

Jeżeli ilość_miejsc_po_przecinku < 1, to zaokrąglenie będzie na odpowiedniej pozycji przed przecinkiem.

Przykład:

$x = Round(-1.582, 1)  ;wynik -1.6
$y = Round(3.1415, 9)  ;wynik bez zmian 3.1415
$z = Round(123.5, -1)  ;wynik 120


Funkcje logiczne

edytuj

Opisane w tym podrozdziale funkcje wykonują operacje logiczne na poszczególnych bitach liczby lub na parze odpowiadających sobie bitów dwóch liczb, a nie na liczbach jako całości.

Najczęściej używa się tego typu operacji przy pracy z rejestrami bitowymi, gdzie każdy bit liczby oznacza ustawienie lub nie jakiegoś parametru. Za pomocą tych operacji można manipulować pojedynczymi bitami: ustawiać, kasować, zmieniać ustawienie na przeciwne, sprawdzać czy bit jest ustawiony czy nie itp.

Wszystkie funkcje działają na 32 bitowych liczbach całkowitych.

BitAnd

edytuj
BitAND ( wyr1, wyr2 [, wyr_n] )

W zwracanej przez funkcją liczbie ustawione są (czyli mają wartość 1) te bity, dla których ustawione są odpowiednie bity wszystkich argumentów.


Żeby to lepiej zrozumieć należy posłużyć się zapisem dwójkowym:

wyr1   = 0010  (2)
wyr2   = 0011  (3)
wyr3   = 0110  (6)
------------------
BitAND = 0010  (2)

Kod do powyższego przykładu:

$res = BitAND ( 2, 3, 6)    ;wynik 2


BitOR ( wyr1, wyr2 [, wyr_n] )

W zwracanej przez funkcją liczbie ustawione są (czyli mają wartość 1) te bity, dla których ustawiony jest odpowiedni bit w przynajmniej jednym argumencie, np.:.

wyr1   = 0010  (2)
wyr2   = 0011  (3)
wyr3   = 0110  (6)
------------------
BitOR  = 0111  (7)


BitXOR

edytuj
BitXOR ( wyr1, wyr2 [, wyr_n] )

W zwracanej przez funkcją liczbie ustawione są (czyli mają wartość 1) te bity, dla których ustawiony jest odpowiedni bit w nieparzystej liczbie argumentów, np.:.

wyr1   = 0010  (2)
wyr2   = 0111  (7)
wyr3   = 0110  (6)
------------------
BitXOR = 0011  (3)


BitNOT

edytuj
BitNOT ( wyr )

W zwracanej przez funkcją liczbie ustawione są (czyli mają wartość 1) te bity, które są nieustawione w liczbie argumentu (pamiętajmy,że działamy na 32 bitach), np.:

wyr    = 0000000000000000000000000110101 (53)
BitNOT = 1111111111111111111111111001010 (-54)


BitRotate

edytuj
BitRotate ( wyr, przesunięcie, [ "wielkość" ] )

Rotacja bitów - bity w liczbie są przesuwane o określoną ilość miejsc, a te wychodzące po za zakres pojawiają się na przeciwnym końcu liczby.

przesunięcie - określa o ile miejsc bity będą przesuwane, wartość dodatnia oznacza przesunięcie w lewo, ujemna w prawo.

wielkość - określa ilu bitową liczbą operujemy, "B" - 8 bitów, "W" - 16 bitów, "D" - 32 bity (domyślnie "D" czyli 32 bity).

Np. dla liczby 8 bitowej i przesunięcia = -2 (rotacja w prawo o 2 miejsca)

wyr       = 10010100 (148)
BitRotate = 00100101 (37)

Kod do powyższego przykładu:

$res = BitRotate (148, -2, "B")    ;wynik 37


BitShift

edytuj
BitShift ( wyr, przesunięcie )

Przesunięcie bitów - bity w liczbie są przesuwane o określoną ilość miejsc, a te wychodzące po za zakres są tracone. Aby zachować długość liczby (32 bity), na przeciwnym końcu wstawiana jest odpowiednia ilość bitów zerowych.

przesunięcie - określa o ile miejsc bity będą przesuwane, wartość dodatnia oznacza przesunięcie w lewo, ujemna w prawo.

Np. dla przesunięcia = -2 (przesunięcie w prawo o 2 miejsca)

wyr      = 0000000000000000000000000110101 (53)
BitShift = 0000000000000000000000000001101 (13)


Inne pokrewne i przydatne funkcje

edytuj

W zasadzie nie są to funkcje w sensie matematycznym, ale tematycznie zbliżone, dlatego umieściłem je w tym rozdziale.

Generowanie liczb pseudolosowych

edytuj
Random ( [min [, max [, flag]]] )

Funkcja zwraca liczbę pseudolosową lub 0 gdy podano złe argumenty (w tym wypadku makro @error przyjmuje wartość 1).

min i max - zakres w którym ma się zawierać wygenerowana liczba (domyślne wartości to 0 i 1).

flag - jeżeli wstawimy wartość 1 to generowana będzie liczba całkowita (domyślnie jest generowana liczba rzeczywista).

UWAGA: Jeżeli podamy tylko 1 argument, to będzie on interpretowany jako max (min będzie przyjęte jako 0). Podczas korzystania z liczb całkowitych musi być max-min < 231. Liczby są generowane z zakresu <min, max> (przedział zamknięty, czyli łącznie z wartościami skrajnymi).

Jeżeli min = max to funkcja zwróci min.

Jeżeli min > max to funkcja zwróci 0, a makro @error = 1.

Przykład:

$l = Random(1, 49, 1) ;liczba całkowita z przedziału <1, 49>


SRandom ( wyrażenie )

Funkcje ustawia startowy parametr generatora liczb pseudolosowych. Nie zwraca żadnej wartości.

wyrażenie - parametr startowy generatora, jego wartość powinna zawierać się w przedziale (-231, 231-1).

Jeżeli użyjemy funkcji SRandom, to dla danej wartości parametru startowego funkcja Random wygeneruje zawsze tą samą sekwencję liczb pseudolosowych.

Przykład:

SRandom(2^12+1)
MsgBox(0,"",Random(1,49,1)&", "&Random(1,49,1)&", "&Random(1,49,1))
;za każdym razem zostanie wylosowana sekwencja 9, 5, 15


Zamiana liczby dziesiętnej (lub wartości binarnej) na szesnastkową

edytuj
Hex ( wyrażenie, [ długość ] )

Zmienia zapis liczby systemu dziesiętnego (decymalnego) na szesnastkowy (heksadecymalny). Zwraca string liczby heksadecymalnej lub string pusty, gdy długość jest mniejsza od 1.

Zamienia także wartość binarną (patrz rozdział: Zmienne w AutoIt) na liczbę heksadecymalną.

długość - ilość cyfr heksadecymalnych wyniku, jeżeli długość jest za mała, to znaki są obcinane z lewej strony (w takim przypadku makro @error przyjmuje wartość 1). Maksymalna (i domyślna) długość to 8 lub 16 (w zależności od rodzaju OS, x32 lub x64), co odpowiada liczbie 32 (64) bitowej. Jeżeli rzeczywista długość stringu jest mniejsza od zadanej, to jest on uzupełniany zerami od lewej strony.

Przykład:

$hex = Hex(2^12)   ;wynik "00001000"

Zamiana stringu liczby szesnastkowej na liczbę dziesiętną

edytuj
Dec ( "hex" [, flag = 0] ) )

Funkcja zwraca liczbę dziesiętną lub 0 gdy string "hex" jest błędny (makro @error przyjmuje wartość 1).

"hex" - string liczby szesnastkowej

flag - określa sposób interpretowania stringu:

0 - interpretowany jako liczba całkowita
1 - interpretowany jako liczba 32-bitowa
2 - interpretowany jako liczba 64-bitowa
3 - interpretowany jako liczba zmiennoprzecinkowa

Przykład:

$dec = Dec("B105F")   ;wynik 725087


Liczby w zapisie szesnastkowym (heksadecymalnym)

edytuj

Przy okazji prezentacji powyższych funkcji chciałbym wspomnie o często używanym w programowaniu heksadecymalnym zapisie liczb. Jest on bardzo wygodny z racji budowy komputerów, które posługują się liczbami binarnymi. Każdy adres w komputerze jest sumą potęg liczby 2. Pamięć zorganizowana jest w bajty, czyli 8 bitowe porcje. Ponieważ zapis binarny jest bardzo długi i mało czytelny, stosuje się zapis heksadecymalny. Jego podstawową zaletą jest łatwość konwersji z zapisu binarnego.

Pojedynczego bajta można zapisać, używając tylko dwóch cyfr szesnastkowych i odwrotnie - dowolne dwie cyfry szesnastkowe można zapisać jako bajt. W ten sposób kolejne bajty można łatwo przedstawić w postaci ciągu cyfr szesnastkowych. Ponieważ 4 bity mogą przyjmować jedną z 16 wartości, to zawsze można je przedstawić jedną cyfrę szesnastkową (0-f), podczas gdy w zapisie dziesiętnym będzie to jedna lub dwie cyfry (0-15).

Zapis heksadecymalny używa 16 cyfr, są to: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f (nie ma znaczenia czy użyjemy małych czy wielkich liter).

Aby odróżnić zapis heksadecymalny od dziesiętnego w AutoIt stosuje się prefiks 0x (zero oraz x). Przykładowy zapis będzie więc wyglądał: 0xff01abcd.

Długość liczby heksadecymalnej jest ograniczona do 8 cyfr, co odpowiada liczbie 32 bitowej.

Należy zwrócić uwagę, że w odróżnieniu od argumentu funkcji Dec zapis szesnastkowy liczby np.: 0xff01abcd nie jest stringiem, to liczba tylko inaczej zapisana!

Jeżeli chcemy uzyskać string z liczby heksadecymalnej należy użyć funkcji Hex.

Przykład:

$hex_string = Hex(0xb105f) ;wynik - string "000B105F" (cyfry hex w wyniku wielkimi literami)