Wednesday, September 9, 2009

Aritmetica decimale nella shell

La bash non la supporta. Lasciando stare la notazione a punto fisso (un metodo per usare tramite shift aritmetici gli interi per fare calcoli decimali, praticabile ovviamente anche con la bash) la soluzione più semplice è l'uso del comando esterno bc(1) tramite delle pipe o se preferite con le heredoc di bash.

Ecco un paio di esempi:

$ echo 3 / 2 | bc -l
1.50000000000000000000

$ # calcolo del tempo medio che la luce impiega per andare dalla terra alla luna
$ delay=$(echo 384400 / 299792.458 | bc -l)
$ echo $delay
1.28222038194169647856

In bc la precisione si imposta col comando scale. Questo esempio imposta la precisione a 3 cifre ed esegue un calcolo decimale (radice di 2 diviso 3):

$ bc <<-EOE
>   scale=3
>   sqrt(2)/3
> EOE
.471

L'opzione -l carica la libreria matematica (contenente funzioni avanzate come quelle trigonometriche) e imposta la massima precisione (20 cifre). Se serve impostare solo il numero di decimali si può evitarla, come fatto nel secondo esempio.

Ovviamente la shell non è il linguaggio migliore per fare calcoli complessi perché poco efficiente, ma se serve fare qualche conticino in questo modo si può.

No comments: