Aloinpa miettiä miksi BASHista puuttuu desimaaliluvut. Ilmeisesti se on kehittäjien tapa kertoa että se johtaisi eksponenttimuotoiseen esitykseen ja on parempi olla sotkeutumatta sellaiseen joka on jossain mielessä kelvotonta. On niitä desimaaliluvuilla laskevia sovelluksia silti monia, tässä muutama. Esimerkeistä selviää vasta periaate ja ne vaativat vielä etupäätä.
Teoriassa sinit ja kosinit tunnetaan, pii, logaritmit .... joskaan niitä ei noihin noinvain tungeta.
- luvun numeromäärän kasvaessa siirrytään muissa sovelluksissa lähes aina eksponenttimuotoon mutta tässä ei sillä eksponenttimuodossa tarkkuus romahtaa.
- ja tosiaan BASHiin pätee: kenties nämä jopa laskee väärin joissakin tapauksissa mutta enpähän edes välitä sillä parempia skriptejä on noin miljoona.
- BASH on aina hidas tai sanottaisiinko ei-nopea. Ja jos tekee hommat väärin niin almannakkaa tarvitaan.
esimerkki 1:
#!/bin/bash
function laske () {
tulos=$(eval echo $(echo '"'$(echo ${@} | tr -d " " )'"') | bc -l)
}
laske 0.123456789012345678901234567890123456789 +0.00000000000000000000000000000000000001 +123456789012345678901234567890123456789 *1
echo $tulos
read -p 'paina enter jatkaakseesi'
# keno on tutkinnassa; taitaa se tuloksessa ollakin
# laskettavia voi teoriassa laittaa kuinka monta vaan eikä sitä täydy kertoa missään.
# kaikki normaalit laskutavat +, -, *, /, %(=jakojäännös) tunnetaan ilmanmuuta ja lisää saa pikkuisen virittämällä.
# desimaaleissa löytyy. Niiden määräämistä en hallitse, kai se scale pitäisi ahtaa johonkin.
esimerkki 2:
#!/bin/bash
# awk siirtyy eksponenttiesitykseen kun numerot ei muuten riitä. Awk kykenee myösa sineihin sun logaritmeihin.
luvut[0]='1 2 3.33333'
luvut[1]='4 5 6.66666'
luvut[3]='7 8 9.99999'
echo -e 'matriisin\n '"${luvut[@]/%/\n}""\n"
echo -e ' '"${luvut[@]/%/\n}" | awk '{summa+=$3} END {print "sarakkeen 3 summa on: ",summa}'
echo ${luvut[1]} | awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print "rivin 1 summa on: "s}'
echo -e ' '"${luvut[@]/%/\n}" | awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print "koko matriisin summa: "s}'
read -p 'paina enter jatkaakseesi
- ongelmat ratkesi bc:llä - ainakin 138 numeron tarkkuuteen.
- kun tekee etupään geditistä saa laskimen, joka kelpaa vaikka veroilmoituksen vähennysten laskemiseen - pennilleen valtion budjetissa. Tietenkään kukaan ei kuvittelisikaan käyttävänsä tällaista, mutta mikäli vaivautuu tekemään muun laskutusjärjestelmän - noin pari vuotta ja kaikki kaupalliset jäisi toiseksi.
- kaupallinen ei koskaan ole luotettava. Itsetehdyssä jokainen lisäpaketti johon joutuu turvautumaan pienentää sekin luotettavuutta.
Toinen asia: olen käyttänyt skriptieni funktionimissä ääkkösiä muutamia kuukausia ja hyvin tuntuu toimivat. Tiedostonimissä on ollut ääkköset jo vuosia. Samoin välilyönti on ongelmaton kunhan laittaa tiedostonimen sulkeisiin - kenoa ei kannata tiedostonimissä käyttää.
Uusi: Aina sillointällöin läppärini bluetooth lakkaa toimimasta. Takaisin toimintaan sen saa käskyllä: sudo service bluetooth restart . Mutta minun päässäni ei muistia olekaan joten neljän sanan muistaminen on mahdotonta. Mutta kun käsky on kerran annettu pysyy se Ubuntun muistissa ikuisesti ja sen saa suoritettua uudestaan käskyllä: !?bluetooth
- tosin historia on vain 500 riviä alkuunsa. Sen saa rajoittamattomaksi kun laittaa tiedostoon .bashrc käskyn: export HISTSIZE=""
- muistikoot ovat nykyään niin suuria ettei se ei aiheuta vaikeuksia koskaan.
- !?käskyn_osa toimii kaikissa tilanteissa.