12. diel - Matematické funkcie v Dart a knižnica dart: math
V minulej lekcii, Vnorené zoznamy v Dart , sme si predstavili vnorené zoznamy. Tento Dart tutoriál venujeme prehľadu matematických metód, ktoré sa nám v našich programoch iste budú v budúcnosti hodiť.
Základné matematické metódy sú v Dart v knižnici dart:
math. Trieda nám poskytuje základné konštanty: E
,
PI
, ďalej i druhú odmocninu z čísla 2 (SQRT2
) az
1/2 (SQRT1_2
) a niekoľko předpočítaných logaritmov
LN10
, LN2
, LOG2E
a LOG10E
.
PI
je pochopiteľne číslo Pí (3.1415 ...) a E
je
Eulerovo Číslo, teda základ prirodzeného logaritmu (2.7182 ...). Asi je
jasné, ako sa konštantami tejto knižnice pracuje, ale pre istotu si na
ukážku konštanty Vypíšme do konzoly:
print('Pí: $PI'); print('e: $E'); print('2. odmocnina ze 2: $SQRT2'); print('2. odmocnina z 1/2: $SQRT1_2'); print('Logaritmus čísla 10 o základu e: $LN10'); print('Logaritmus čísla 2 o základu e: $LN2'); print('Logaritmus čísla e o základu 2: $LOG2E'); print('Logaritmus čísla e o základu 10: $LOG10E');
Výstup programu:
Konzolová aplikácia
Pí: 3.141592653589793
e: 2.718281828459045
2. odmocnina ze 2: 1.4142135623730951
2. odmocnina z 1/2: 0.7071067811865476
Logaritmus čísla 10 o základu e: 2.302585092994046
Logaritmus čísla 2 o základu e: 0.6931471805599453
Logaritmus čísla e o základu 2: 1.4426950408889634
Logaritmus čísla e o základu 10: 0.4342944819032518
Poďme si teraz popísať metódy, ktoré trieda poskytuje:
Metódy knižnice dart: math
Min () a max ()
Začnime s tým jednoduchším.:) Obe funkcie berú ako parameter dve čísla
ľubovoľného dátového typu. Funkcia min()
vráti to menšie,
funkcia max()
to väčší z nich.
Sin (), cos (), tan ()
Klasické goniometrické funkcie, ako parameter berú uhol v radiánoch typu
num
(tj. int
alebo double
). Pre konverziu
stupňov na radiány stupňa vynásobíme * (PI / 180)
. Výstupom
je double
.
ACOS (), asin (), atan (), ATAN2 ()
Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa
hodnoty goniometrické funkcie vráti daný uhol. Parametrom je opäť hodnota
typu num
, výstupom je uhol v radiánoch (double
).
Pokiaľ si prajeme mať uhol v stupňoch, vydelíme radiány
/ (180 / PI)
.
Funkcia atan2()
je štvorkvadrantové variant funkcia
atan()
, ako parameter berie 2 čísla a
,
b
a ak je b
kladné, výsledok je rovnaký ako
atan(b / a)
. Funkcia atan2()
je teda vhodná pre
prevod z kartézských
súradníc do súradníc polárnych.
Pow () a sqrt ()
Funkcia pow()
berie dva parametre typu (num
), prvý
je základ mocniny a druhý exponent. Vracia výsledok ako int
,
alebo, ak aspoň jeden parameter bol typu double
, vracia výsledok
ako double
. Ak by sme teda chceli spočítať napr. 2 3,
kód by bol nasledujúci:
print(pow(2, 3));
sqrt()
je skratka zo square root a vráti teda druhú odmocninu
z daného čísla typu num
. Výsledok vracia ako
double
.
Exp (), log ()
Funkcia exp()
vracia Eulerovo Číslo, umocnené na daný
exponent. Funkcia log()
vracia prirodzený logaritmus daného
čísla.
V zozname metód nápadne chýba ľubovoľná odmocnina. My ju však
dokážeme spočítať aj na základe funkcií, ktoré dart:math
poskytuje.
Vieme, že platí: 3. odm. z 8 = 8 ^ (1/3). Môžeme teda napísať:
print(pow(8, 1/3));
Delenie
Programovacie jazyky sa často odlišujú tým, ako v nich funguje delení čísel. Túto problematiku je nutné dobre poznať, aby ste neboli potom (nepríjemne) prekvapení. Napíšme si jednoduchý program:
//int a = 5 / 2; int a2 = (5 / 2).toInt(); int a3 = 5 ~/ 2; double b = 5 / 2; double c = 5.0 / 2; double d = 5 / 2.0; double e = 5.0 / 2.0; print('$a2\n$a3\n$b\n$c\n$d\n$e');
V kóde niekoľkokrát delíme 5 / 2
, čo je matematicky
2.5
. Iste ale tušíte, že výsledok nebude vo všetkých
prípadoch rovnaký. Trúfnete si tipnúť si čo kedy vyjde? Skúste to.
Kód by sa nespustil kvôli riadku s premennou a
, preto sme ho
zakomentovali. Problém je v tom, že v tomto prípade vyjde desatinné číslo
(kvôli delenie), ktoré sa snažíme uložiť do položky celého
(int
). Výstup programu je potom nasledovné:
Konzolová aplikácia
2
2
2.5
2.5
2.5
2.5
Vidíme, že výsledok sa zhoduje s tým, čo by sme očakávali v
matematike. Celočíselný je vtedy, keď výsledok po delení prevedieme na
int
metódou toInt()
, alebo ak použijeme
celočíselné delenie ~ /. Naopak, výsledok každého delenie
je vždy desatinný.
V Dart nemožno priradiť celočíselný literál (napr. 4
) do
typu double
a naopak i trebárs "pekný" desatinný literal do typu
int
(napr. 4.0
).
// double x = 4; double x = 4.toDouble(); // int y = 4.0; int y = 4.0.toInt();
Pozn .: V iných programovacích jazykoch toto nemusí byť pravidlom a správanie sa môže líšiť. Dávajte si na túto problematiku pozor.
Zvyšok po delení
V našich aplikáciách môžeme často potrebovať zvyšok po delení (tzv.
Modulo). U nášho príkladu 5 / 2
je celočíselný výsledok
2
a modulo 1
(zvyšok). Modulo sa často používa pre
zistenie či je číslo párne (zvyšok po delení dvojkou je 0
),
keď chcete napr. Vyfarbiť šachovnicu, zistiť odchýlku vašej pozície od
nejakej štvorcovej siete a podobne.
V Dart a všeobecne v céčkových jazykoch zapíšeme modulo ako
%
:
print(5 % 2); print('Výsledek 5 / 2 je ${5 ~/ 2} a zbytek je ${5 % 2}.');
Metódy na type num
Ako sme si už spomínali skôr, priamo dátový typ num
(z
ktorého vychádza int
i double
) má veľa ďalších
metód. Povieme si niečo teda io nich.
Round (), roundDouble (), floor (), floorToDouble (), ceil (), ceilToDouble ()
Všetky funkcie zaokrúhľujú číslo. Funkcia round()
sa
chová ako klasické zaokrúhľovania v matematike, floor()
naopak
zaokrúhľuje iba bane, ceil()
zas len nahor (). Všetky 3 funkcie
vracia typ int
a majú aj varianty (s Postfix ...
toDouble()
), ktoré vracajú typ double.
print('round: ${k.round()}, ${l.round()}, ${m.round()}'); print('floor: ${k.floor()}, ${l.floor()}, ${m.floor()}'); print('ceil: ${k.ceil()}, ${l.ceil()}, ${m.ceil()}');
Výstup programu:
Konzolová aplikácia
round: 4, 4, 5
floor: 4, 4, 4
ceil: 4, 5, 5
ToInt (), toDouble (), toString ()
Všetky čísla sa môžu presúvať medzi celočíselnú a desatinnú reprezentáciou, prípadne previesť aj do reťazca.
Abs () a sign ()
Funkcia abs()
vracia absolútnu hodnotu, sign()
vracia podľa znamienka -1
, 0
alebo 1
(pre záporné, nulu a kladné číslo).
IsFinite, isInfinite, isNegative
Čísla majú tiež vlastnosti, ktoré nám pomôžu určiť, či je číslo konečné, nekonečné alebo záporné.
Tak to by sme mali prácu s matematickými funkciami. V budúcom lekcii,
Riešené úlohy k 11.-12. lekciu Dart , si niečo povieme o hodnote null
a ako s ňou pracovať.
Blížime sa ku koncu:-)
V nasledujúcom cvičení, Riešené úlohy k 11.-12. lekciu Dart, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 6x (1.8 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Dart