Aloin jo kauan sitten selvittää syytä miksi väitetään ettei BASH desimaalilaskuihin kykene - ja paljastui että väitetty syy on sama kuin miksi hiihtokilpailuissa hävitään: voitelu oli väärää - tai siis BASH:in suhteen sanottiin että eihän BASH:issa edes ole desimaali-tyyppiä eikä sen matematiikka-moottorikaan desimaalipilkkua hyväksy. Ei kummallakaan ole desimaalilaskujen kanssa muuta tekemistä kuin että ne yleensä helpottaa ja joskus romahduttaa - mutta täyyhän ne silti kumota:
1. desimaali-tyyppimäärittely on suurten lukujen suhteen rajoittava tekijä eikä siitä tyyppimäärityksestä ole mitään iloa. Esimerkiksi luku:
12345678901234567890123456789012345678901234567890123456789012345678901234567890.1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901. Onko se desimaaliluku? Mahtuuko se johonkin? Sitäpaitsi BASH tuntee lukujärjestelmät joiden kantaluku on välillä 2-60 joten merkeissä löytyy - joten oikeastaan ne olisivat tekstijonoja koska kaikki aakkosetkin kelpaavat. Siinäpä muuten salasana: $((60#petteriIII)) elikä kun sen kirjoittaa päätteeseen saa: 254376408104369084: command not found
2. ei semmoista asiaa olekaan kun desimaalilaskin sillä kaikki laskimet ovat kokonaislukulaskimia - sillä numerot tulevat laskuissa oikein kun desimaali pisteen poistaa. Siinä desimaali-laskimeksi kutsutussa on lisäosa pilkun paikan määrittämiseen. BASH:issa siis joutuu töihin kaksi kertaa - mutta koska kumpikin kerta on nopeudeltaan satakertainen uusilla käskyillä suoritettuihin verrattuna niin nopea se lopputuloskin vielä on.
Esitetäänpä niiden desimaali-laskujen nopeuksia:
- vähänumeroiset laskut ovat niin nopeita ettei oikeastan voi sanoa minkä nopeutta mitataan - linuxin, tulkkin vaiko skriptin.
- sillä Linux myöntää todella pieniä toiminta-aikoja kaikille toimille - ja jotkut toimethan täytyy suorittaa aivan ehdottomasti ja loput hommat laitetaan tärkeysjärjestykseen - kaikille annetaan toiminta-aikoja mutta toisille useammin ja esimerkiksi BASH:ille tosiharvoin. Tämä paitsi hidastaa niin tekee myös toimimisen nopeudesta epämääräistä. BASH-skriptien toiminta-ajat vaihtelevatkin liian paljon vaikka ottaisi väli-muistienkin toiminnan huomioon. Siitä päätellen niitä on hidastettu tälläkin tavoin vähintään kymmenkertaisesti ja ehkäpä paljon enemmänkin. Sillä BASH:istahan halutaan päästä eroon.
- 36 numeroinen liuku-luvun kertolasku - siinä on 30 käskyä ja aikaa kuluu millisekunti joten yhden käskyn suoritus kestää 33 mikrosekuntia.
- jakolasku on omituinen - esimerkiksi: 75.1234567 / 1233457 =
.00006090480389669035888563606189757729697914074021226520259725308624459547434568047366061403032290546002008987747444783239302221317808403535753577
sen satakunta käskyä se käy läpi millisekunnissa joten yhden käskyn suoritusaika on 10 mikrosekuntia. Tulos on tarkka numerolleen. Skripti on rekursiivinen ilman rekursiota - siinä se omituisuus.
- sitten potenssiin korottaminen - siis laskujen tyyppiä: 10.987654321098 ^ 10 - siinä on yli 300 käskyä ja aikaa kuluu 3 millisekuntia elikä yhden käskyn nopeus on parempi kuin 10 mikrosekuntia.
- sitten logaritmointi - siis laskujen tyyppiä: ota briggsin logaritmi luvusta: 17.35178533715 . Käskyrivejä tulee 1965 ja nopeudella 12ms tulee käskyä kohti noin 6 mikrosekuntia.
- kelvottoman huonoja aikoja muille kielille mutta BASH:ille ajat ovat erinomaisia sillä pienet perus-laskut ovat nopeampia mitä matematiikka-ohjelmilla saisi - ja tulevaisuudestahan ei tiedä - vaikkka jotain vielä mullistavampaa löytyisi.
- näin alussa on ehdottoman tärkeää voida todeta tuleeko laskuista oikea tulos. Siksi noissa laskuissani esitetään aina myös bc:n tulos välittömästi edellisellä rivillä tulosten desimalipisteet samalla kohtaa jotta vertaileminen olisi nopeaa ja varmaa - sillä bc:n tulos on varmasti oikea ja lisäksi se esittää tulokset oikealla tavalla. Miksei siis käytetä bc:tä kokoajan? Koska pienissä perus-laskuissa se jää toiseksi ja muut laskut ovat vain leikkimistä numeroilla.
- senkin takia noita lasku-rutiineja kannattaa tehdä koska opittuaan niiden toiminnan voi samoilla menetelmillä määritellä muitakin aikaisemmin mahdottomiksi luultuja toimia.
- alkeellisimmista toteutuksista saa toistaiseksi vain vajaat 18 oikeaa numeroa, kaksoistarkkuudestan 36 numroa, nelois-tarkkuudesta 72 numeroa .... ainakin kaksoistarkkuus on melkein yhtänopeaa kuin tavallinenkin ja eiköhän ne muutkin ole melkein yhtä nopeita - mutta skriptien tekeminen niihin olisi niin vaivalloinen ja puuduttava tehtävä etten enää pysty semmoisiin tehtäviin - vaikka periaate on sama kuin ennenkin ja onnistuminen varmaa.
- ohjelmalliset toteutukset häviävät kyllä rautalangasta tehdyille tuhatkertaisesti ilmanmuuta - mutta BASH:in tarkoitus on vain tehdä mahdolliseksi tehdä kohtuullisessa ajassa toimivia prototyyppejä eikä toimia käytännössä.
- ne alkuperäisetkin komennot oli tehty tekstinkäsittelyyn eikä niillä numeron-murskausta noinvaan pysty tekemään. En tiedä varmasti mutta todennäköiseltä tuntuu että monikin on noita vanhoja komentoja desimaalilaskuihin käyttänyt.
- koska myös vanhat komennot ovat tekstinkäsittely-käskyjä nopeutuisi kaikki muukin skriptaaminen niitä käytettäessä.