ARCHIV |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Linux v příkazech - aritmetikaV Linuxu existuje několik vynikajících matematických nástrojů. Je to téma, o kterém se v češtině příliš nepíše. Zaměřme se proto na aritmetiku v shellu. Velký prostor budeme věnovat příkazu bc - kalkulátoru s libovolnou přesností. Dostane se i na reverzní polskou notaci a příkaz dc. Aritmetika a shellAritmerický výraz má v Bashi dvě možnosti zápisu. $((výraz)) nebo $[výraz]. Celý takovýto zápis se vyčíslí a má stejný efekt, jako bychom napsali přímo výsledek výrazu. Zápis $((2+1)) je tedy ekvivalentní zápisu 3. K tisku hodnoty slouží příkaz echo:
Je třeba mít na paměti, že takto lze používat jen celá čísla. Můžeme používat i operátory pro porovnávání nebo logické operátory. Je-li výraz pravdivý, vrací výraz 1, v opačném případě 0.
Samozřejmě, že lze pracovat i s proměnnými. Ukažme si, jak to funguje.
Existuje alternativa k předcházejícím příkazům, kterou je příkaz expr. Zabývat se jím nebudeme, protože je značně pomalejší. Kalkulátor bc10000 faktoriál, Ludolfovo číslo na 2000 desetinných míst získané programem o dvou jednoduchých příkazech nebo třeba odmocnina ze 2 vyjádřená tisícovkami číslic za desetinnou čárkou. To je bc - kalkulátor libovolné přesnosti. Limitem je jen rychlost procesoru. bc jako příkaz je interpretem jazyka podobného Céčku. Není nijak zvlášť rozsáhlý a složitý. Přesto umí zajímavé věci. Lze psát bc skripty nebo přímo zadávat kód v interaktivním režimu. Použití
Jako soubor se uvádí jméno souboru s bc skriptem. Neuvedeme-li ho, dostaneme se do interaktivního režimu. Přepínače
Interaktivní režimPříkazy se oddělují znakem nového řádku nebo středníkem. Samotné odentrování je prázdným příkazem. Protože se často výsledek nevejde na jediný řádek, bc tiskne po určité délce nový řádek a před něj zpětné lomítko. Řádek se zpracovává ihned po odentrování. Chceme-li tomu zamezit, musíme na konec řádku psát zpětné lomítko. V takovém případě bude brát interpret konec řádku za mezeru. KomentářeVše mezi /* a */ je ignorováno ProměnnéPlatí o nich více méně to, co v jiných programovacích jazycích. Lze používat skalární proměnné i pole. Klíč pole se píše bezprostředně za jeho název do hranatých závorek.
Speciální proměnnéPro bc je velmi důležitá obzvláště proměnná scale.
Pokračujme stále v kódu:
Funkce
Matematická knihovna, zavedená volbou -l
Mimochodem, zkuste přečíst názvy funkcí odshora dolů. Dávají název proměnné scale (dobré pro zapamatování;-) Podívejme se na několik příkladů:
Operacebc se zde chová velmi podobně jako jiné jazyky. Operace +, -, *, /, % jsou samozřejmě k dispozici. Umocnění se provádí znakem ^. Modulus nemusí být celočíselný. Záleží na nastavení scale.
Funguje inkrementace - postfixová i prefixová:
Lze používat i přiřazovací operace typu operátor=.
Operátory pro porovnání <, >, <=, >=, ==, != vrací 1 (true) nebo 0 (false).
Nad POSIX můžeme použít i logické operátory !, &&, ||.
Priorita operátorůKaždý způsob vyhodnocování výrazů má obvykle tabulku, která definuje prioritu operací. V té naší platí, že čím je operátor výše, tím vyšší má prioritu.
Pozor na nezvykle vysokou prioritu u přiřazení! Sledujme následující příklad:
Výsledkem porovnání je 0, ale do p byla přiřazena hodnota 2. Řídící strukturyV testech je vždy uváděn výraz. Je-li vyhodnocen jako 0, cyklus končí nebo v případě podmínky se blok neprovádí. Podmínka:
Větev else je už mimo POSIX. Cyklus while:
Cyklus for:
break ukončuje cyklus while nebo for, continue přejde na další iteraci cyklu. bc ukončíme příkazem quit. Cykly a podmínky více není třeba rozebírat. Princip je stejný jako v jiných jazycích. Stačí zalistovat v některém ze seriálů, které na Linuxsoftu vycházejí. Nějaké limity bc ve skutečnosti má. Zjistíme je příkazem limits. Jejich hodnotu ale můžeme sami libovolně nastavit při kompilaci. Definice vlastních funkcíStruktura:
Příkazem auto se definují lokální proměnné, return určuje návratovou hodnotu funkce. bc v praxiTeď přijde na řadu to slibované Ludolfovo číslo a 10000 faktoriál. Vytvořme skript, který přijme ze standartního vstupu číslo a vytiskne jeho faktoriál. Definujeme funkci f(), načteme číslo, vytiskneme jeho faktoriál a ukončíme.
Teď skript spusťme a vyzkoušejme. Výstup pro faktoriál 10000 neuvádějme, protože by byl delší než tento článek:)
Výpočet Ludolfova čísla je velmi jednoduchý, pokud víme jak na to. Arkus tangens jedné je jeho jednou čtvrtinou. Můžeme tak napsat:
Proměnná scale určuje počet desetinných míst.
Kombinace bc a shelluZkusme spočítat Eulerovo číslo na 1000 desetinných míst pomocí bc funkce e(1) přímo z příkazového řádku. V bc k tomu potřebujeme příkazy scale=1000; e(1);. Ty pošleme rourou příkazu bc ke zpracování.
Jako bonus ještě přesměrujeme tisk do souboru, přidáme Perl a regulární výrazy, čímž odstraníme zpětná lomítka a nové řádky.
Zkusme podobným způsobem vypsat Ludolfovo číslo na 1000 desetinných míst na výstup.
Výstupy zde neuvádíme, protože už jsou příliš dlouhé, ale každý si to může vyzkoušet sám. Manipulací s hodnotou proměnné scale můžeme korigovat přesnost. Pro více než pár tisíc číslic se ale výpočet už neúměrně protahuje. Proto, pokud opravdu stojíte o přesnější pí (jakože v praxi více než 10 desetinných míst běžný člověk v životě nepoužije), hledejt e zde a Eulerovo číslo zde. Polská reverzní notace a kalkulátor dcdc je další kalkulátor s libovolnou přesností. Zprvu vysvětleme, co to vlastně polská reverzní (nebo-li postfixová) notace je. Jedná se o speciální zápis matematických výrazů, kdy změníme u jednotlivých operací pořadí operátorů a operandů tak, aby všechny operandy byly nalevo a operátor napravo. Klasickému zápisu 9 + 15 odpovídá zápis 9 15 + v polské reverzní notaci. Tato notace je výrazně jednodušší na zpracování (dc používá zásobník) a jednodušší syntaxi (nepotřebujeme závorky ani =, nutné jsou jen mezery), problémem však je jistá neintuitivnost (pro člověka je méně přehledná). Na začátek upozorněme, že unární minus se v dc vyjadřuje nezvykle podtržítkem (to je ale při zápisu v polské reverzní notaci logické řešení). Použití
Jako soubor se uvádí jméno souboru s dc skriptem. Přepínače
Syntaxe dcZkusme spočítat 8 * 9 v dc a vytisknout. Pro tisk je třeba použít speciální příkaz p.
Lze použít i zápis v parametru pomocí přepínače -e:
Čísla, která zadáme se ukládají v zásobníku (stacku). Uvedeme-li operaci (v našem případě *), do zásobníku se uloží výsledek po násobení posledních dvou čísel v zásobníku (která se z něj samozřejmě odstraní). Poslední hodnotu v zásobníku vytiskneme příkazem p. Zde je seznam příkazů:
OperaceK dispozici jsou standardní operace: +, -, *, /, % (modulus), ^ (mocnina), v (odmocnina). PřesnostZkusme vynásobit 0.5 * 0.5.
(Nulu před desetinnou tečku uvádět nemusíme, zápisy 0.5 a .5 jsou ekvivalentní.) dc počítá jen s přesností, se kterou jsme zadali operandy. Pomůže zápis:
Ale je i jiná a lepší možnost. Nastavit přesnost globálně.
Nejsme omezeni jen na desítkovou soustavu. Následující příkazy umožňují soustavy od dvojkové po šestnáctkovou libovolně měnit:
Další příkazy:
dc skriptyKdyž nechceme, nemusíme vůbec používat interaktivní režim. Ten se totiž nehodí pro používání v shellových skriptech. Klidně můžeme vytvořit jen soubor s posloupností příkazů.
Na výstup se tiskne výsledek:
MakraZkusme následující zápis:
Do bufferu 5 byla uložena hodnota 7p v hranatých závorkách. Použijeme-li příkaz lbufferx, je to jako bychom provedli příkazy, uložené v bufferu. Příkladydc umí stejně jako bc odmocninu ze 2 na moc desetinných míst:
Zkusme ji získat přímo z příkazového řádku:
Těžko bychom hledali shellový příkaz, počítající 100 desetinných míst odmocniny ze 2, který se vejde do 14 znaků. Využili jsme k tomu i možnost hustit znaky bez mezer. To lze s výjimkou zápisu několika samostatných čísel za sebou. Mezi nimi být bílý znak samozřejmě musí. A odmocnina ze 2 naposled, tentokrát přes makra:
V dc můžeme volat příkazy shellu - například ls. Otázkou zůstává, k čemu to může být dobré...
Kolik je 2005 v trojkové soustavě?
Máme BAF v šestnáctkové soustavě, kolik je to v dvojkové?
Ještě jednou předveďme práci s buffery:
Nejprve jsme přidali tři hodnoty do zásobníku, poté jsme poslední z nich smazali a zkopírovali ji do bufferu 1 a nakonec opět vyvolali. A nakonec zkusme zavolat příkaz a, který převádí poslední hodnotu v zásobníku na znak, jehož bude ona hodnota ASCII hodnotou:
Zdroje
Související články
Předchozí Celou kategorii (seriál) Další
Linux v příkazech - úvod
Linux v příkazech - správa uživatelských účtů Linux v příkazech - ssh, rsync Linux v příkazech - práce se soubory a adresáři Linux v příkazech - TCP, ftp, http Linux v příkazech - konfigurace sítě Linux v příkazech - diagnostika sítě Linux v příkazech - GnuPG Linux v příkazech - archivace a komprese Linux v příkazech - OpenSSL Linux v příkazech - správa procesů Linux v příkazech - sudo Linux v příkazech - čtení a zpracování textu Linux v příkazech - vylaďte si Bash! Linux v příkazech - správci verzí Linux v příkazech - manuálové stránky Linux v příkazech - screen Linux v příkazech - vypalování CD/DVD Linux v příkazech - porovnávání souborů Linux v příkazech - plánované spouštění procesů Linux v příkazech - hledání souborů Linux v příkazech – práce s Wi-Fi osd volume v xfce Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |