Ako robiť matematiku s pohyblivou rádovou čiarkou v skriptoch Linux Bash
Keď dosť blízko nestačí, potrebujete čísla s pohyblivou rádovou čiarkou.
Kľúčové poznatky
- Linuxový Bash shell podporuje iba celočíselnú aritmetiku a nemôže vykonávať výpočty s číslami s pohyblivou rádovou čiarkou.
- Nástroj bc v Linuxe umožňuje presné výpočty s pohyblivou rádovou čiarkou interaktívne a v skriptoch shellu.
- Pomocou bc môžete nastaviť počet desatinných miest na zobrazenie a vykonávanie výpočtov s ľubovoľnou presnosťou, vrátane použitia funkcií zo štandardnej matematickej knižnice.
Linuxový Bash shell podporuje iba celočíselnú aritmetiku. Nedokáže pochopiť ani si poradiť s výpočtami s pohyblivou rádovou čiarkou. Nástroj bc vám poskytuje presné výpočty s pohyblivou rádovou čiarkou interaktívne a v skriptoch shellu.
Prečo Bash podporuje iba celé čísla
Pôvodné rozhodnutie o návrhu obmedziť shell UnixBourne na celočíselnú aritmetiku mohlo vychádzať z prvotného výpočtového mapovania celého čísla na jeden bajt RAM. Možno sa nikdy nedozvieme, čo bolo v skutočnosti za týmto rozhodnutím. Ani, prečo sa Linuxová verzia Bourne shellu, shell Bash, rozhodla nasledovať.
Samotný Bash nemôže vykonávať výpočty na číslach s pohyblivou rádovou čiarkou a výpočty na celých číslach, ktoré by mali zlomkovú časť odpovede, sa uvádzajú ako skrátené celočíselné hodnoty. To platí na príkazovom riadku a v skriptoch shellu Bash. V závislosti od vášho prípadu použitia to môže byť problematické alebo zastavujúce.
Linux sa dodáva s dvoma pomocnými aplikáciami, ktoré vám umožňujú vykonávať výpočty s pohyblivou rádovou čiarkou. Jedným z nich je dc. Je to trochu kuriozita, ktorá funguje v obrátenej poľskej notácii. Ďalším nástrojom je bc. Dá sa použiť interaktívne alebo ako príkaz a je to riešenie, o ktorom tu budeme diskutovať.
Problém
Nechajte Bash vydeliť šesť tromi.
echo $((6 / 3))
Dostávame našu očakávanú odpoveď dvoch. Teraz vydeľme šesť siedmimi. Je jasné, že to bude mať zlomkovú odpoveď.
echo $((6 / 7))
Nula sa zjavne mýli. Skúsme to znova, vydelíme 16 číslom 7.
echo $((16 / 7))
Dostávame odpoveď dvoch. Deje sa tak, že zlomková časť odpovede sa zahodí, takže odpoveď je skrátená. V prvom príklade nebola žiadna zlomková časť, takže dostaneme správnu odpoveď.
Druhý príklad nemal v odpovedi žiadny celočíselný prvok, iba zlomkovú časť. Pretože zlomková časť bola vyradená, odpoveď, ktorá sa nám zobrazuje, je nula.
V treťom príklade sa 7 delí na 16 dvakrát, so zlomkovým zvyškom. Zvyšok sa opäť zahodí a výsledok sa skráti.
Používanie bc interaktívne
Bc môžete použiť ako interaktívnu kalkulačku zadaním bc a stlačením klávesu „Enter“.
bc
Aplikácia bc sa spustí, oznámi číslo svojej verzie a potom čaká na váš vstup. Zadaním výpočtu a stlačením „Enter“ bc vyhodnotí výpočet a zobrazí odpoveď.
16 * 4
1024 / 32
2^2 * 1024
Pomocou „Ctrl+L“ môžete vymazať obrazovku a „Ctrl+D“ ukončiť program. Skúsme výpočet, ktorý bude mať v odpovedi zlomkovú zložku.
22 / 7
To sme neočakávali. Napriek tomu, že nám bc umožňuje používať ľubovoľnú presnosť, v predvolenom nastavení nezobrazuje desatinnú čiarku ani žiadne čísla, ktoré za ňou nasledujú.
Aby bola pravdivá odpoveď viditeľná, musíme bc povedať, koľko desatinných miest sa má zobraziť. Robíme to príkazom „scale“. Požiadame o sedem desatinných miest a zopakujeme výpočet.
scale=7
22 / 7
Konečne sa niekam dostávame. Nastavenie „mierky“ zostane na svojom mieste, kým ho nezmeníte. Nastavenie počtu desatinných miest bc povie maximálny počet miest na zobrazenie. Ak odpoveď nepotrebuje toľko desatinných miest, zobrazí sa s počtom desatinných miest, ktorý vyžaduje, a nie viac. Nie je vyplnený nezmyselnými nulami.
scale=10
0.300003 * 0.5
Rôzne výpočty môžete uviesť na rovnakom riadku pomocou bodkočiarky „;“ aby som ich oddelil. Odpovede sú zobrazené na riadkoch ako obvykle, v poradí, v akom boli uvedené výpočty.
25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9
Do zoznamu môžete zahrnúť aj príkaz „mierka“.
scale=8; 22 / 7; scale=3; 0.3 * 0.071
Štandardná matematická knižnica
Voľba -l (štandardná matematická knižnica) spôsobí, že bc načíta sadu funkcií a nastaví „mierku“ na 20 desatinných miest.
bc -l
22 / 7
S načítanou štandardnou knižnicou môžete tieto funkcie použiť vo svojich výpočtoch.
- s (x): sínus x
- c (x): kosínus x.
- a (x): arkustangens x
- l (x): prirodzený logaritmus x
- e (x): exponenciála e k hodnote x
- j (n,x): Besselova funkcia celočíselného rádu n z x.
Sínus, kosínus a arkustangens používajú hodnoty radiánu.
s (1.1)
c (.891207)
a (.628473)
Odosielanie vstupu do bc na príkazovom riadku
Na odoslanie vstupu do bc môžete použiť presmerovanie a potrubia. Spracuje váš vstup a zobrazí odpoveď v okne terminálu.
Môžete presmerovať do bc s alebo bez voľby -l (štandardná matematická knižnica).
bc <<< 22/7
bc -l <<< 22/7
Aby bol vstup prepojený do bc, vstup musí byť výstupom iného procesu. Na tento účel je vhodné použiť echo.
echo 22/7 | bc
echo 22/7 | bc -l
Ak máte vo vstupe medzery alebo chcete zahrnúť príkaz „mierka“, vložte svoj vstup do úvodzoviek.
echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc
Použitie bc v skriptoch Bash Shell
Teraz máme všetko, čo potrebujeme, aby sme mohli vykonávať výpočty s pohyblivou rádovou čiarkou v našich bash skriptoch s nami zvolenou presnosťou. V našich výpočtoch môžeme tiež odkazovať na Bash premenné vrátane parametrov skriptu.
Tu je náš príklad skriptu. Skopírujte tento text do editora, uložte ho ako „pi.sh“ a potom zatvorte editor.
#!/bin/bash
first_number=22
second_number=7
pi=$(echo "scale=$1; $first_number/$second_number" | bc)
echo "Pi to $1 decimal places is: $pi"
Na uloženie dvoch číselných hodnôt používame dve premenné, „first_number“ a „second_number“. Tieto premenné používame vo vstupe, ktorý privádzame do bc.
Použili sme tiež prvý parameter príkazového riadka odovzdaný skriptu, „$1“, ako hodnotu na nastavenie „mierky“.
Predtým, ako budeme môcť vyskúšať náš skript, musíme ho urobiť spustiteľným pomocou chmod.
chmod +x pi.sh
Skúsme náš skript s rôznymi hodnotami príkazového riadku.
./pi.sh 5
./pi.sh 14
./pi.sh 20
Dostaneme pi zobrazené na počet miest, ktoré určíme v príkazovom riadku nášho skriptu.
Všetko sa sčítava
Prekročenie obmedzení Bashovej matematiky, ktorá obsahuje iba celé číslo, dáva našim skriptom presnosť a presnosť.
Používanie odozvy na prenos vstupu do bc v skriptoch je trochu neohrabané, ale funguje to perfektne a výhody stoja za to.