Hlavní navigace

Matematika v příkazové řádce VI - utilita calc (1)

28. 2. 2006
Doba čtení: 10 minut

Sdílet

V šestém pokračování seriálu věnovaného matematicky zaměřeným aplikacím provozovaným z příkazového řádku se budeme věnovat utilitě calc, což je plnohodnotný aritmetický kalkulátor s možnostmi programování i poměrně složitých funkcí, včetně podpory práce s poli, seznamy a řetězci.

Obsah

1. Základní informace o aplikaci calc
2. Přednosti a zápory aplikace calc
3. Základy práce s calcem
4. Hodnoty a proměnné
5. Matematické výrazy a operátory
6. Funkce použitelné v matematických výrazech
7. Obsah dalšího pokračování tohoto seriálu

1. Základní informace o aplikaci calc

Na aplikaci calc se můžeme z uživatelského hlediska dívat jako na dosti podstatné rozšíření již dříve popsané utility bc. Jedná se – zejména v porovnání s utilitami dc a bc – o poměrně nový nástroj umožňující programování (skriptování) matematických výpočtů pomocí programovacího jazyka, jenž se především svou syntaxí i sémantikou příkazů do značné míry podobá známému programovacímu jazyku C. Oproti céčku však byly některé jazykové konstrukce odstraněny, například ukazatelová aritmetika. Podobně jako u utilit dc a bc i zde je možné veškerou práci provádět interaktivně, tj. uživatelem zapsané programy (skripty) se nemusí předem explicitně překládat, protože se postupně provádí – interpretují – již při svém zápisu.

Programátorům jsou k dispozici mnohé příkazy známé už z céčka i dalších programovacích jazyků postavených (syntakticky) nad céčkem, tj. C++, Javou, PHP apod: podmínkové příkazy (if, else, switch), smyčky (while, for, do), operátory a výrazy (==, ++, *=) apod. Na rozdíl od staticky (i když slabě) typovaného programovacího jazyka C se však v případě calcu jedná o dynamicky typovaný jazyk, tj. u proměnných, argumentů funkcí ani u jejich návratových hodnot není zapotřebí definovat typ, ten je dán hodnotou, kterou proměnná nese. Veškeré aritmetické výpočty se provádí s čísly majícími prakticky neomezenou přesnost a rozsah.

2. Přednosti a zápory aplikace calc

Mezi největší přednost aplikace calc bezesporu patří značná přehlednost vytvořených skriptů, které se velmi podobají programům zapsaným v jazyku C, a to včetně práce s poli a možnosti zápisu numerických hodnot v osmičkové i šestnáctkové číselné soustavě. Touto vlastností předčí calc dokonce i starší utilitu bc, která se také snažila céčko do určité míry napodobovat. Další předností je podobná koncepce při práci s numerickými hodnotami, jako tomu bylo u předešlých utilit – nepoužívají se primitivní datové typy daného matematického koprocesoru (float, double), ale čísla s prakticky neomezenou přesností. calc také pracuje s řetězci mnohem lépe než utility dc a bc, k dispozici je mnoho funkcí zpracovávajících řetězce včetně funkce printf() sloužící pro formátovaný tisk numerických a řetězcových hodnot. Mimo numerických hodnot a řetězců jsou podporována i pole, seznamy a, jak se na „matematickou“ aplikaci sluší a patří, i matice.

calc má však i své nevýhody. Jednou z nevýhod je to, že se jedná o poměrně nový program, který není zahrnut ve standardu POSIX. Nelze se tedy spoléhat, že skript určený pro calc bude provozovatelný na všech unixových systémech, o dalších typech systémů ani nemluvě, viz například slova autorů o portu na dnes nejrozšířenější desktopový systém:

NOTE: The main developers do not have access to a Windoz based platform. While we will make an effort to not break calc Windoz based system, our lack of a Windoz test environment will mean we will make mistakes from time to time. Hopefully Windowz users can overcome these mistakes. Of course you are welcome to send us any patches that fix your Windoz build environment.

Výše uvedená poznámka není (alespoň pro poslední vydanou verzi) až tak úplně pravdivá, protože pod Microsoft Windows je možné aplikaci calc přeložit a následně zprovoznit, a to buď s Cygwinem, nebo jako samostatnou aplikaci.

Druhým problémem, i když v praxi většinou méně podstatným, je menší rychlost provádění skriptů kromě základních matematických operací, které se provádí zhruba stejnou rychlostí jako u utilit dc a bc. V praxi se však s tímto problémem setkáme jen v ojedinělých případech, například při přesném výpočtu číselných řad nebo určitých integrálů při použití malého integračního kroku.

3. Základy práce s calcem

Před prvními pokusy s calcem je nutné aplikaci nejdříve nainstalovat, samozřejmě pokud se již ve vaší distribuci nenachází. Zdrojové kódy calcu jsou dostupné na adrese http://www.is­the.com/chongo/src/cal­c/ popř. na adrese http://www.is­the.com/chongo/tech/com­p/calc/calc-download.html (stahuje se soubor calc-verze.tar.gz, například calc-2.11.11.tar.gz). Na téže adrese se nachází i balíky RPM, a to jak se zdrojovými kódy, tak i binární verzí a vývojářskou verzí – ta obsahuje hlavičkové soubory a knihovny, které je možné použít pro volání funkcí calcu z jiných aplikací, například z programů napsaných v céčku. V dalším textu budu popisovat instalaci z archivního souboru calc-2.11.11.tar.gz, která je univerzální pro všechny operační systémy:

  1. Nejprve se archiv rozbalí příkazy: gunzip calc-2.11.11.tar.gz a posléze tar -xvf calc-2.11.11.tar. Po rozbalení vznikne obvyklá adresářová struktura, v níž se mimo céčkových zdrojových souborů nachází i soubor Makefile a v několika podadresářích ukázkové skripty a nápověda (ta je mimochodem v calcu velmi podrobná a obsahuje i informace o vlastnostech, které by mohly překvapit především céčkaře při práci s touto aplikací).
  2. Další průběh instalace je ovlivněn tím, zda se má aplikace spolu s nápovědou, knihovnami a doprovodnými skripty instalovat do systému, nebo se bude pouze testovat v uživatelově domovském adresáři. Pokud by se mělo jednat o plnohodnotnou instalaci, je zapotřebí upravit nastavení cest v souboru Makefile, při testování se – alespoň na Linuxu – soubor Makefile upravovat nemusí a může se ihned přejít k následujícímu bodu instalace.
  3. Vlastní překlad je, jak to už v dnešní době bývá obvyklé, velmi jednoduchý: zapíše se příkaz make all a po doběhu překladu ještě make check, který přeloženou aplikaci otestuje pomocí mnoha numerických příkladů. Pokud se má provést instalace calcu do systému, musí se ještě provést příkaz make install.

Po provedeném překladu je možné začít calc používat. Ze začátku si ukážeme práci v interaktivním režimu, calc je však samozřejmě možné použít i s předpřipra­venými skripty. Spuštění calcu v interaktivním režimu je velmi jednoduché: prostě se zavolá program calc a program by se měl ohlásit následujícím výpisem (které se může v jiných verzích mírně odlišovat):

C-style arbitrary precision calculator (version 2.11.11)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.] 

Výše vypsané hlášení není zcela přesné, jelikož aplikaci je možné ukončit i příkazem quit, což je příjemné, protože já osobně si ukončovací příkazy mezi jednotlivými interaktivními programy pletu (škoda, že calc nepodporuje ještě archaický bye). Ihned po spuštění calcu je možné zadávat příkazy a aplikace je bude po jejich odeslání klávesou [Enter] provádět. Můžeme si to vyzkoušet na jednoduchých příkladech (podobně jako v předcházejících dílech tohoto seriálu i zde jsou příkazy zadávané uživatelem zvýrazněny tučným písmem):

[root@/usr/bin]:calc

C-style arbitrary precision calculator (version 2.11.11)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 1+2
        3
; 2*3
        6
; 1+2*3+4^5
        1031
; 1<2
        1
; 1>2
        0
; quit 

V dalších kapitolách si jednotlivé elementy programovacího jazyka calcu popíšeme podrobněji.

4. Hodnoty a proměnné

Numerické hodnoty (celočíselné či reálné) mohou být zadávány podobným způsobem jako v mnoha dalších programovacích jazycích, reálné hodnoty se zapisují buď svou celou a desetinnou částí nebo pomocí mantisy a exponentu:


0
1
3.14
3e10
 

Za zmínku stojí informace, že záporná čísla se vyjadřují pomocí své absolutní hodnoty (tj. čísla kladného) a unárního operátoru - zapsaného před absolutní hodnotou. V předchozím příkladu byla všechna čísla zapsána v desítkové soustavě, calc však podporuje i zápis v dalších třech číselných soustavách. Pokud jsou před numerickou hodnotou zapsány znaky , jedná se o číslo zapsané v šestnáctkové (hexadecimální) soustavě, znaky 0b značí soustavu binární (to je užitečné rozšíření oproti céčku a je zajímavé, že céčko jako nízkoúrovňový jazyk tento zápis nepodporuje). A konečně znak 0 (nula) značí soustavu osmičkovou – to mimo jiné znamená, že celé číslo zapsané v desítkové soustavě nesmí začínat nulou. Následující čtyři řádky představují stejnou celočíselnou hodnotu 255 (desítkově):


255
0xff
0b11111111
0377
 

Kromě celých a reálných čísel pracuje calc i s čísly komplexními, které jsou zapisovány pomocí své reálné a imaginární části; imaginární část přitom musí obsahovat znak i:

1+2i 

calc při deklaracích rozlišuje mezi třemi typy proměnných (datový typ proměnné není zapotřebí uvádět, calc si totiž typ odvodí z typu hodnoty do proměnné zapsané). Prvním typem jsou lokální proměnné, které jsou přístupné pouze uvnitř funkcí či příkazových bloků. Druhým typem jsou proměnné globální, ke kterým je možné přistupovat z libovolného místa programu. Třetím a posledním typem jsou statické proměnné, které jsou viditelné pouze uvnitř funkce či příkazového bloku, jejich hodnota je však zachována i po opuštění dané funkce či bloku. Proměnné se deklarují s pomocí klíčových slov local, global a static, viz následující příklad:

global a, b, c;
local  x, y, z;
static zx1, zx2, zx3; 

Proměnné nemusí obsahovat pouze numerické hodnoty, ale také řetězce nebo se může jednat o složitější datové typy – pole, seznamy, matice či objekty. O proměnných si povíme podrobnější informace v dalším pokračování tohoto seriálu, kde si ukážeme tvorbu funkcí.

5. Matematické výrazy a operátory

Matematické výrazy se v calcu zapisují podobným způsobem jako v programovacím jazyku C. Nejvýraznější rozdíl spočívá v tom, že se v interaktivním režimu na standardní výstup vypisují výsledky výpočtů, není tedy zapotřebí používat funkce print atd. Ve výrazech je možné používat velké množství operátorů, které se většinou zapisují v infixové podobě, tj. vždy mezi dvojicí operandů (těmi může být buď numerická konstanta nebo proměnná). Vzhledem k infixovému zápisu musí být stanovena priorita operátorů, kterou je možné měnit (jako ve většině programovacích jazyků) pomocí kulatých závorek. Přiorita některých operátorů se liší od jazyka C, a to zejména v případech, kdy céčková priorita (která, jak sami tvůrci tohoto jazyka přiznávají, není ideální) vedla k nadbytečné potřebě zápisu mnoha závorek k ovlivnění provádění operací. V první tabulce je uveden výpis všech operátorů, které calc nabízí, v tabulce druhé jsou operátory seřazeny podle své priority (směrem k nejvyšší prioritě).

Operátor Typ operátoru Význam
+ binární aritmetický součet
binární aritmetický rozdíl
* binární aritmetický součin
/ binární podíl s reálným výsledkem
// binární podíl s celočíselným výsledkem
% binární dělení modulo (u kladných čísel zbytek po dělení)
^ binární mocnina (celočíselná)
** binární mocnina (celočíselná)
++ unární zvýšení hodnoty o jedničku
-- unární snížení hodnoty o jedničku
+ unární kladná hodnota
unární záporná hodnota (změna znaménka)
! unární negace výrazu
&& binární logický součin
|| binární logický součet
& binární bitový součin (prováděný bit po bitu)
| binární bitový součet
<< binární bitový posun doleva
>> binární bitový posun doprava
= binární operátor přiřazení (vrací přiřazenou hodnotu)
+= binární přiřazení s aritmetickým součtem
-= binární přiřazení s aritmetickým rozdílem
*= binární přiřazení s aritmetickým součinem
/= binární přiřazení s reálným podílem
//= binární přiřazení s celočíselným podílem
%= binární přiřazení s dělením modulo
^= binární přiřazení s celočíselným umocněním
**= binární přiřazení s celočíselným umocněním
&= binární přiřazení s operací and
|= binární přiřazení s operací or
<<= binární přiřazení s bitovým posunem doleva
>>= binární přiřazení s bitovým posunem doprava
?: ternární podmíněný výběr jednoho ze dvou alternativních výrazů
== binární test na relaci „rovná se“
!= binární test na relaci „nerovná se“
< binární test na relaci „menší než“
> binární test na relaci „větší než“
<= binární test na relaci „menší nebo rovno“
>= binární test na relaci „větší nebo rovno“
. binární přístup ke složce objektu
, binární postupné vyčíslení více výrazů
() unární volání funkce
[] binární indexace pole
[[]] binární indexace pole nebo objektu
Priorita Operátor
1 ,
2 += -= = /= %= //= &= |= <<= >>= ^= **=
3 =
4 ?:
5 ||
6 &&
7 == != <= >= < >
8 +  – (binární operátory)
9 / // %
10 |
11 &
12 ^ ** << >>
13 +  – ! (unární operátory)
14 ++ --
15 [] [[]] . ()

6. Funkce použitelné v matematických výrazech

Aplikace calc implementuje velké množství funkcí, které je možné použít v matematických výrazech. Tyto funkce, které jsou rozděleny do několika skupin, jsou podrobně popsané v přiložené dokumentaci, v následující tabulce jsou uvedeny pouze ty nejpoužívanější či nejužitečnější funkce:

root_podpora

Funkce Popis
sin sinus
cos kosinus
tan tangens
cot kotangens
atan2 arkustangens
abs absolutní hodnota
sqrt druhá odmocnina
fact výpočet faktoriálu
sum součet hodnot
ssq součet čtverců hodnot
avg průměr hodnot
ln přirozený logaritmus (Eulerův)
det determinant matice
matsum součet prvků matice
mattrans transpozice matice
str převod čísla na řetězec
strcat spojení dvou řetězců
strcmp porovnání řetězců
strcpy kopie řetězce
strlen vrací délku řetězce
strprintf formátovaný tisk do řetězce
substr vrací podřetězec s řetězce

7. Obsah dalšího pokračování tohoto seriálu

V sedmém pokračování tohoto seriálu se budeme věnovat popisu podmíněných příkazů, počítaných i nepočítaných smyček, vytvářením nových funkcí a dalším vlastnostem, které je možné při psaní skriptů pro calc použít.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.