WYRAŻENIA
W programie można definiować funkcje (formuły arytmetyczne) za pomocą następujących jednostek (atomów, leksemów, tokenów):

Operatory:
Symbole oznaczające operację arytmetyczną na jednym lub kilku elementach (operandach):
+ dodawanie lub oznaczenie liczby dodatniej - unarny, np.: +2, 4+0.1
- odejmowanie lub oznaczenie liczby ujemnej - unarny, np.: -1.7, 5.1-3
* mnożenie, np. 3*6
/ dzielenie, np. 6.8/2

! silnia, np. 4!
^ potęgowanie, np. 2^4
Ograniczniki jednoznakowe:
( ) nawiasy
; znak oddzielający kolejne argumenty w funkcji wieloargumentowej

Funkcje:
- jednoargumentowe:
sin, cos, tan, ctan - trygonometryczne
asin - arc sin
acos - arc cos
atan - arc tan
actan - arc ctan
sqrt - pierwiastek kwadratowy
ln - logarytm naturalny

exp(x) - podnoszenie e do potęgi x
floor - 'podłoga'- zaokrąglanie w dół
ceil - 'sufit'- zaokrąglanie do góry
abs - wartość absolutna (bezwzględna)
frand(x) = x * rzeczywista liczba losowa z przedziału <0;1>
time(0) - liczba milisekund od włączenia systemu
not(x) – negacja logiczna

- dwuargumentowe:
log(x;y) - logarytm z x przy podstawie y
root(x;y) - pierwiastek z liczby x stopnia y

mod(x;y) - x modulo y, np.: mod(-2;5) = -2, mod(-8;5) = -3, mod(8;5) = 3
modulo(x;y) - prawdziwe (matematyczne) modulo, np. modulo(-2;5) = 3
rand(x;y) - całkowita liczba losowa z przedziału <x;y>
min(x;y) - minimum z x i y
max(x;y) - maksimum z x i y
saw(x;y) - 'piła', 'zygzak', 'ząb' w każdym przedziale o długości y, rozpoczynając od punktu x
gcm(x;y) - największy wspólny dzielnik (ang. Greatest Common Measure)

lcm(x;y) - najmniejsza wspólna wielokrotna (ang. Least Common Multiple)

or(x;y) - suma logiczna
and(x;y) - iloczyn logiczny
xor(x;y) - exclusive or
rbit(x;y) - zeruje wszystkie bity na lewo od pozycji y, np. rbit(1110101b;3) = 5 czyli 101b

Funkcje logiczne oraz gcm, lcm operują na liczbach dodatnich, 64-bitowych.

- trójargumentowe:
pmod(b;n;m) = (b^n) modulo m - funkcja użyteczna dla bardzo dużych liczb (dzięki możliwości redukcji modulo)

range(x;a;b) = {1, gdy (x>=a i x<b); 0 w przeciwnym przypadku}
xrange(x;a;b) = {x, gdy (x>=a i x<b); 0 w przeciwnym przypadku}

- czteroargumentowe:
rangew(x;a;b;y) = {y, gdy (x>=a i x<b); 0 w przeciwnym przypadku}
cykl(a;b;c;x) - jeśli modulo(x-c,a+b) < a to cykl()=0; w przeciwnym przypadku cykl()=1, zobacz np. cykl(3;4;1;x), gdzie 3 i 4 - to długości cyklu, a 1 - to przesunięcie

Stałe:
Zdefiniowanych jest 15 stałych:

M_PI pi - liczba Pitagorasa
M_PI_2 - pi/2
M_PI_4 - pi/4
M_1_PI - 1/pi
M_2_PI - 2/pi
M_1_SQRTPI - 1/(pierwiastek z pi)
M_2_SQRTPI - 2/(pierwiastek z pi)

M_E - wartość liczby e
M_LOG2E - log2(e)
M_LOG10E - log10(e)
M_LN2 - ln(2)
M_LN10 - ln(10)

M_SQRT2 - pierwiastek z 2
M_SQRT_2 - (pierwiastek z 2)/2
NN +'nieskończoność' = 1.7e308 (wersja double), 1.18973149535723162e4932 (wersja long double)

Zmienne:
Zmienna reprezentuje przez swoją nazwę jakąś wartość zmiennej zadeklarowanej w programie.
Nazwą zmiennej może być nieograniczonej długości ciąg alfanumeryczny zaczynający się literą, jednak:
-nie może się rozpoczynać od małych liter: 'b', 'o', 'h'
-nie może kończyć się mała literą 'h', np. AFFh, AfBh; bo jest wtedy konflikt z zapisem liczb szesnastkowych.
Przykłady dobrych nazw: x, ZmiennaY, z12, lab, o0o.
Zatem każdy atom zaczynający się cyfrą musi być liczbą.

Oprócz systemu dziesiętnego można używać także zapisu liczb w 3 innych systemach (reprezentacjach liczb): dwójkowym, ósemkowym i szesnastkowym. Oznaczenie tych systemów następuje przez dopisanie odpowiedniej litery na końcu liczby:
- 'b' - dla systemu dwójkowego (binarnego); używamy tylko z cyfr {0,1}; np. 1011b
- 'o' - dla systemu ósemkowego; używamy tylko cyfr {0..7}; np. 765o
- 'h' - dla systemu szesnastkowego; używamy wszystkie cyfry {0..9} oraz litery {a..f} lub {A..F}; np. 1aFh

Podczas obliczania wartości wyrażenia dla niektórych funkcji sprawdzane są następujące warunki:
- Dzielenie: a/b: b<>0
- Potęgowanie: a^b: Nie może być (a<0 i b-floor(b)>0), tzn. gdy a<0 i b nie jest liczbą całkowitą
- oraz (a=0 i b<=0),
- sin(a), cos(a), tan(a): |a|<= MaxTryg
- ctan(a): |a|<= MaxTryg i tan(a)<>0
- asin(a), acos(a): |a|<=1
- atan(a), actan(a): |a|<= MaxTryg
- Silnia: a!: a>=0 i a < 171 (wersja double), 1754 (wersja long double)
- Pierwiastek kwadratowy: sqrt(a): a>=0
- Logarytm naturalny: ln(a): a>=0
- exp(a): a <= 709.782226 (wersja double), 11356.499999999999 (wersja long double)
- Logarytm z a przy podstawie b: log(a;b): b>0, b<>1, a>0
- Pierwiastek stopnia b z a: root(a;b): b>0, a>=0
- Liczba losowa z przedziału <a;b>: rand(a;b): |a|<=32767 i |b|<=32767 oraz a<b
- (b^n) mod m: pod(b,n,m): m>0, n>=0 oraz jeśli (int)(b)=0, to (int)(n)>0
- MaxTryg = 9007199254740991 (wersja double), 9223372036854775295.999 (wersja long double)
Ponadto przechwytywane są wszelkie wyjątki, np. przekroczenie zakresu liczb.
Pierwszeństwo i kolejność operatorów przy wyznaczaniu wartości wyrażeń
Pierwszeństwo obliczania operatorów od najniższego:
1: -, +
2: *, /
3: ^
4: !
5: - unarny (najwyższe pierwszeństwo)

Operatory o takim samym pierwszeństwie obliczane są w kolejności od lewej do prawej.

Ujęcie wyrażenia w nawiasy powoduje podniesienie pierwszeństwa tego wyrażenia.

Całe wyrażenie jest zawsze liczone kolejno od początku lewej strony w kierunku do prawej strony. Przykładowo - wyrażenie: x*5+2-3 jest liczone w taki sposób ((x*5)+2)-3 a nie np. (x*5)+(2-3).

Uwagi:
- Przy zapisie liczb dziesiętnych, część ułamkową można rozdzielić kropką ‘.’ lub przecinkiem ‘,’.
- Maksymalną długość wyrażenia ustalono na 8192 znaki.
- Można stosować uproszczony zapis niektórych wyrażeń; np. 2x+sin(5y) zamiast 2*x+sin(5*y) - czyli dla złożeń: liczba i zmienna.
- Wszystkie atomy w wyrażeniu mogą być porozdzielane dowolną liczbą spacji.
- Nie można stosować zapisu typu: 3!!. Należy w tym przypadku użyć nawiasów: (3!)!
- Można stosować zapisy typu: 2*-4, 8/+2, 2^-3, 2+-1, --3
Wersja pomocy: 2006-12m-24d

Autor: Artur Czekalski; email ARTUR@epokaY.net
Strona główna www.epokaY.net/artur/programowane.php