Newsgroup: it.comp.os.linux.iniziare
Titolo: [Bash] Calcoli matematici

Mi farebbe comodo un vostro parere su quale
soluzione scegliere per eseguire dei calcoli
matematici all'interno di script bash.
 
Alcune cose che ho notato e di cui ho bisogno:
 
1- calcoli con numeri reali
 
Questo mi ha indotto ad utilizzare "bc",
che ho trovato ottimo, pur accontentandosi
della forma:
 
echo "scale=<n_decimali>; <expr>; <expr> | bc"
 
Dalla necessità 1 ad ogni modo ho lasciato
perdere il builtin bash:
 
$((<expr>))"
 
Perchè si limita all'aritmetica (numeri interi).
 
 
 
2- In alcune occasioni mi sarebbe servito
   il supporto da parte di "bc" alle potenze
   ad esponente frazionario.
 
Dal manuale di bc leggo invece che l'esponente
della potenza deve essere intero.
 
Usando le proprietà dell'esponenziale/logaritmo
si può tirar fuori un'espressione molto scomoda
a mio avviso, per ottenere il risultato della
potenza ad esponente frazionario con "bc".
Io cercavo qualcosa di più semplice e comodo.
 
 
Allora vi chiedo, avete qualche idea di come
svolgere calcoli matematici dentro script di
shell?
 
Grazie in anticipo!  :)

 shell?
 
Maxima e' da riga di comando in console, come bc, solo che dovresti
studiarci un po'. Devi installare 3 file in tutto come minimo. Con la
Debian le dipendenze son queste:
maxima
  Dipende: libc6
  Dipende: libgmp10
  Dipende: libreadline6
  Dipende: libx11-6
  Dipende: gnuplot-x11
    gnuplot-qt
  Consiglia: <texmacs>
  Consiglia: maxima-doc
  Consiglia: xmaxima
  Consiglia: maxima-emacs
  Consiglia: <wish>
    tk8.4
    tk8.5
    tk8.6
  Raccomanda: maxima-share
 
 
 
-- 
Tanti saluti
 

 bc, solo che dovresti studiarci un po'.
 
Ok, ma non riesco a trovare esempi di utilizzo
di maxima da shell. Consideriamo u esempio, la
divisione tra due variabili "a" e "b".
Con bc posso fare come segue da shell:
___________________
 
NJ@localhost:~$ a=3
NJ@localhost:~$ b=4
NJ@localhost:~$ echo "scale=3; $a/$b"
scale=3; 3/4
NJ@localhost:~$ echo "scale=3; $a/$b" | bc
.750
____
 
Come fare invece usando maxima invece di bc?
Non è che hai qualche link dove lo spiegano?
 
In ogni caso grazie!  :D


perl e fai tutto
 
Es:
 
perl -e 'printf("%0.2f",3.5555 * 2.4444)'
 
 

 perl -e 'printf("%0.2f",3.5555 * 2.4444)'
 
Penso sia una buona soluzione.
Una cosa ancora... Nell'esempio sopra se avessimo
due variabli al posto di due numeri:
 
$ a=3.5555
$ b=2.4000
 
Come segue non funziona:
 
$ perl -e 'printf("%0.2f",$a * $b)'
 
Come andrebbe scritta per farla digerire alla shell?
 
Grazie.


se a e b sono impostate nella shell occorre fare cosi:
 
export a=3.5555
export b=2.4000
 
c=$(perl -e 'printf("%0.2f",$ENV{a} * $ENV{b})')
echo $c
 
 
mette in c il risultato di a * b
 
 


Diciamo che non è davvero il massimo
della comodità però funionare funziona...
 
Se vi viene in mente qualche altra idea
per sostituire "bc" con supporto anche
agli esponenti non interi benvenga!
 
Grazie mille intanto!

 agli esponenti non interi benvenga!
 
C'e' anche Awk che lo fa, pero' la sintassi non la so. Ma perche' Perl
non ti va, per la portata? Bc per questo e' eccezionale.
 
-- 
Tanti saluti
 

 shell?
 
La Soluzione :-) e` usare "octave" come
stai usando "bc" o similmente.
Ovviamente un po' "over-engineered", ma
fa tutto e di piu`.
 
Tra l'altro, a seconda di cosa serva, si
puo` anche fare:
 
bc << END_OF_MY_LIST
a=1
b=2
c=3+a*b
...
 
END_OF_MY_LIST
 
Questo metodo passa in stdin tutto quello
che segue fino al marker di terminazione.
 
bye,
 
-- 
 
piergiorgio


Aiutooo, octave non sar un po' troppo?
Ah ecco over-engineered, non avevo letto...
 
Bello l'here-document  :)
Ma di solito preferisco gestire le variabili
"a" e "b" in bash, piuttosto che in bc. Ma
può essere che a volte torni utile anche il
tuo metodo, non so...
 
Comunque salverei la seconda soluzione col
Perl, ora rispondo anche a quel messaggio.

 c=$(perl -e "printf('%0.2f',$a * $b)")
 
Così va decisamente meglio!  :D
Grazie della dritta, e grazie a tutti
per le idee!  :)
 

 tuo metodo, non so...
 
La domanda, piu` che altro, sarebbe:
 
sei sicuro che bash sia il linguaggio di
programmazione giusto per quello che vuoi
fare? Potenze con esponenti frazionari?
Non sembra molto "bash"...
 
bye,
 
-- 
 
piergiorgio

 Io cercavo qualcosa di più semplice e comodo.
 
Cosa hai contro le funzioni?
 
define pow(a,b) { return e(b*l(a)); } # ricorda di caricare le librerie.
 
 
 

 Non sembra molto "bash".
 
+1

 eccezionale.
 
 
In Gawk l'esponenziazione usa i simboli '^' e '**'.
 
Operatori gawk, in ordine di precedenza:
= += -= *= /= %= ^= **=
?:
||
&&
~ !~
< <= > >= != ==
(blank)
+ -
* / %
+ - !
^ **
++ --
$
in
 
 
-- 
+¿+
 ----

 Maxima
 
ho dei topi in cantina, che tipo di testata
termonucleare mi consigli per debellarli?
-- 
Sarebbe essere un atto di pieta'. 
Contro i miei principi.                            -- whip,  in IFMdI