Akce! Dobij si body, napiš nám do zpráv "Přes léto se to naučím!" a dobijeme ti ještě navíc 50% z této částky! Sleva na výuku platí do 22.6.2018.

Lekce 12 - Matematické funkce v Dartu a knihovna dart:math

Dart Základy Matematické funkce v Dartu a knihovna dart:math

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Vnořené seznamy v Dartu, jsme si představili vnořené seznamy. Tento Dart tutoriál věnujeme přehledu matematických metod, které se nám v našich programech jistě budou v budoucnu hodit.

Základní matematické metody jsou v Dartu v knihovně dart:math. Třída nám poskytuje základní konstanty: E, PI, dále i druhou odmocninu z čísla 2 (SQRT2) a z 1/2 (SQRT1_2) a několik předpočítaných logaritmů LN10, LN2, LOG2E a LOG10E. PI je pochopitelně číslo Pí (3.1415...) a E je Eulerovo číslo, tedy základ přirozeného logaritmu (2.7182...). Asi je jasné, jak se konstantami této knihovny pracuje, ale pro jistotu si na ukázku konstanty vypišme do konzole:

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á aplikace
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

Pojďme si nyní popsat metody, které třída poskytuje:

Metody knihovny dart:math

min() a max()

Začněme s tím jednodušším. :) Obě funkce berou jako parametr dvě čísla libovolného datového typu. Funkce min() vrátí to menší, funkce max() to větší z nich.

sin(), cos(), tan()

Klasické goniometrické funkce, jako parametr berou úhel v radiánech typu num (tj. int nebo double). Pro konverzi stupňů na radiány stupně vynásobíme * (PI / 180). Výstupem je double.

acos(), asin(), atan(), atan2()

Opět klasické cyklometrické funkce (arkus funkce), které podle hodnoty goniometrické funkce vrátí daný úhel. Parametrem je opět hodnota typu num, výstupem je úhel v radiánech (double). Pokud si přejeme mít úhel ve stupních, vydělíme radiány / (180 / PI).

Funkce atan2() je čtyřkvadrantová varianta funkce atan(), jako parametr bere 2 čísla a, b a pokud je b kladné, výsledek je stejný jako atan(b / a). Funkce atan2() je tedy vhodná pro převod z kartézských souřadnic do souřadnic polárních.

pow() a sqrt()

Funkce pow() bere dva parametry typu (num), první je základ mocniny a druhý exponent. Vrací výsledek jako int, nebo, pokud alespoň jeden parametr byl typu double, vrací výsledek jako double. Pokud bychom tedy chtěli spočíst např. 23, kód by byl následující:

print(pow(2, 3));

sqrt() je zkratka ze square root a vrátí tedy druhou odmocninu z daného čísla typu num. Výsledek vrací jako double.

exp(), log()

Funkce exp() vrací Eulerovo číslo, umocněné na daný exponent. Funkce log() vrací přirozený logaritmus daného čísla.

V seznamu metod nápadně chybí libovolná odmocnina. My ji však dokážeme spočítat i na základě funkcí, které dart:math poskytuje.

Víme, že platí: 3. odm. z 8 = 8^(1/3). Můžeme tedy napsat:

print(pow(8, 1/3));

Dělení

Programovací jazyky se často odlišují tím, jak v nich funguje dělení čísel. Tuto problematiku je nutné dobře znát, abyste nebyli poté (nepříjemně) překvapeni. Napiš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ódu několikrát dělíme 5 / 2, což je matematicky 2.5. Jistě ale tušíte, že výsledek nebude ve všech případech stejný. Troufnete si tipnout si co kdy vyjde? Zkuste to.

Kód by se nespustil kvůli řádku s proměnnou a, proto jsme ho zakomentovali. Problém je v tom, že v tomto případě vyjde desetinné číslo (kvůli dělení), které se snažíme uložit do čísla celého (int). Výstup programu je poté následující:

Konzolová aplikace
2
2
2.5
2.5
2.5
2.5

Vidíme, že výsledek se shoduje s tím, co bychom očekávali v matematice. Celočíselný je tehdy, když výsledek po dělení převedeme na int metodou toInt(), nebo pokud použijeme celočíselné dělení ~/. Naopak, výsledek každého dělení je vždy desetinný.

V Dartu nelze přiřadit celočíselný literál (např. 4) do typu double a naopak i třebas "hezký" desetinný literál do typu int (např. 4.0).

// double x = 4;
double x = 4.toDouble();

// int y = 4.0;
int y = 4.0.toInt();

Pozn.: V jiných programovacích jazycích toto nemusí být pravidlem a chování se může lišit. Dávejte si na tuto problematiku pozor.

Zbytek po celočíselném dělení

V našich aplikacích můžeme často potřebovat zbytek po celočíselném dělení (tzv. modulo). U našeho příkladu 5 / 2 je celočíselný výsledek 2 a modulo 1 (zbytek). Modulo se často používá pro zjištění zda je číslo sudé (zbytek po dělení dvojkou je 0), když chcete např. vybarvit šachovnici, zjistit odchylku vaší pozice od nějaké čtvercové sítě a podobně.

V Dartu a obecně v céčkových jazycích zapíšeme modulo jako %:

print(5 % 2);

print('Výsledek 5 / 2 je ${5 ~/ 2} a zbytek je ${5 % 2}.');

Metody na typu num

Jak jsme si již zmiňovali dříve, přímo datový typ num (z kterého vychází int i double) má spoustu dalších metod. Řekneme si něco tedy i o nich.

round(), roundDouble(), floor(), floorToDouble(), ceil(), ceilToDouble()

Všechny funkce zaokrouhlují číslo. Funkce round() se chová jako klasické zaokrouhlování v matematice, floor() naopak zaokrouhluje pouze dolu, ceil() zas pouze nahoru(). Všechny 3 funkce vrací typ int a mají i varianty (s postfixem ...toDouble()), které vracejí 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á aplikace
round: 4, 4, 5
floor: 4, 4, 4
ceil: 4, 5, 5

toInt(), toDouble(), toString()

Všechna čísla lze převádět mezi celočíselnou a desetinnou reprezentací, případně převést i do řetězce.

abs() a sign()

Funkce abs() vrací absolutní hodnotu, sign() vrací podle znaménka -1, 0 nebo 1 (pro záporné, nulu a kladné číslo).

isFinite, isInfinite, isNegative

Čísla mají také vlastnosti, které nám pomohou určit, zda-li je číslo konečné, nekonečné nebo záporné.

Tak to bychom měli práci s matematickými funkcemi. V příštím lekci, Dynamic, var, null a null aware operátory, si něco povíme o hodnotě null a jak s ní pracovat. Blížíme se ke konci :-)


 

Stáhnout

Staženo 0x (1.8 kB)
Aplikace je včetně zdrojových kódů v jazyce Dart

 

 

Článek pro vás napsal Honza Bittner
Avatar
Jak se ti líbí článek?
1 hlasů
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Miniatura
Předchozí článek
Vnořené seznamy v Dartu
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Dart
Miniatura
Následující článek
Cvičení k 11.-12. lekci Dartu
Aktivity (4)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!