GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire calcoli interi e float, in Bash o in altre lingue/framework?

Usando echo "20+5" produce letteralmente il testo “20+5 “.

Quale comando posso usare per ottenere la somma numerica, 25 in questo caso?

Inoltre, qual è il modo più semplice per farlo semplicemente usando bash per il punto
mobile? Ad esempio, echo $((3224/3807.0)) stampa :(.

Sto cercando risposte utilizzando la shell dei comandi di base ("riga di comando
") stessa o utilizzando i linguaggi disponibili dalla riga di comando
.

Risposta accettata:

Ci sono molte opzioni!!!

Riepilogo

$ printf %.10f\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ echo "$((20.0/7))"                       # (ksh93/zsh/yash, some bash)
$ awk "BEGIN {print (20+5)/2}"
$ zcalc
$ bc <<< 20+5/2
$ bc <<< "scale=4; (20+5)/2"
$ dc <<< "4 k 20 5 + 2 / p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
$ echo 20 5 2 / + p | dc 
$ echo 4 k 20 5 2 / + p | dc 
$ perl -E "say 20+5/2"
$ python -c "print(20+5/2)"
$ python -c "print(20+5/2.0)"
$ clisp -x "(+ 2 2)"
$ lua -e "print(20+5/2)"
$ php -r 'echo 20+5/2;'
$ ruby -e 'p 20+5/2'
$ ruby -e 'p 20+5/2.0'
$ guile -c '(display (+ 20 (/ 5 2)))'
$ guile -c '(display (+ 20 (/ 5 2.0)))'
$ slsh -e 'printf("%f",20+5/2)'
$ slsh -e 'printf("%f",20+5/2.0)'
$ tclsh <<< 'puts [expr 20+5/2]'
$ tclsh <<< 'puts [expr 20+5/2.0]'
$ sqlite3 <<< 'select 20+5/2;'
$ sqlite3 <<< 'select 20+5/2.0;'
$ echo 'select 1 + 1;' | sqlite3 
$ psql -tAc 'select 1+1'
$ R -q -e 'print(sd(rnorm(1000)))'
$ r -e 'cat(pi^2, "n")'
$ r -e 'print(sum(1:100))'
$ smjs
$ jspl
$ gs -q  <<< "5 2 div 20 add  ="

Dettagli

Conchiglie

Puoi usare l'espansione aritmetica POSIX per intero aritmetica echo "$((...))" :

$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22

Abbastanza portatile (ash dash yash bash ksh93 lksh zsh ):
Usando l'abilità printf per stampare float possiamo estendere la maggior parte delle shell per eseguire calcoli in virgola mobile anche se con un intervallo limitato (non più di 10 cifre):

$ printf %.10f\n "$((1000000000 *   20/7  ))e-9"
2.8571428570

ksh93 , yash e zsh supporta i float qui:

$ echo "$((1.2 / 3))"
0.4

solo ksh93 (direttamente) e zsh caricamento della libreria mathfunc qui:

$ echo "$((4*atan(1)))"
3.14159265358979324

(zsh è necessario caricare zmodload zsh/mathfunc per ottenere funzioni come atan ).

Interattivamente con zsh:

$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17

Con (t)csh (solo intero):

% @ a=25 / 3; echo $a
8

Nel rc famiglia di shell, akanga è quello con espansione aritmetica:

; echo $:25/3
8

Forziere POSIX

bc (vedi sotto per la modalità interattiva), manuale qui

Mnemonico:b est c calcolatore (sebbene il b è infatti per base ).

$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000

(supporta numeri di precisione arbitrari)

bc modalità interattiva:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
5+5
10

2.2+3.3
5.5

La soluzione di Rush, expr (nessuna modalità interattiva):

$ expr 20 + 5
25
$ expr 20 + 5 / 2
22

La soluzione di Joshua:awk (nessuna modalità interattiva):

$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333

Altri strumenti più o meno portatili

La soluzione di Arcege, dc (modalità interattiva:dc ):

Il che è ancora più divertente poiché funziona con la notazione polacca inversa.

$ echo 20 5 2 / + p | dc 
22
$ echo 4 k 20 5 2 / + p | dc 
22.5000

Ma non così pratico a meno che tu non lavori molto con la notazione polacca inversa.

Correlati:racchiudere e non racchiudere il valore di una variabile tra virgolette in bash?

calc di DQdims (richiesto sudo apt-get install apcalc) :

$ calc 2 + 4
6

Interpreti linguistici generici:

la soluzione di manatwork, node (modalità interattiva:node; funzione di output non necessaria):

$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5

Perl (modalità interattiva:perl -de 1 ):

$ perl -E "say 20+5/2"
22.5

Pitone (modalità interattiva:python; funzione di output non necessaria):

$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5

Supporta anche numeri di precisione arbitraria:

$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184

Se hai clisp installato, puoi anche usare la notazione polacca:

$ clisp -x "(+ 2 2)"

La soluzione di Marco, lua (modalità interattiva:lua ):

$ lua -e "print(20+5/2)"
22.5

PHP (modalità interattiva:php -a ):

$ php -r 'echo 20+5/2;'
22.5

Rubino (modalità interattiva:irb; funzione di output non necessaria):

$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5

Astuzia (modalità interattiva:guile ):

$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5

S-Lang (modalità interattiva:slsh; funzione di output non necessaria, solo un ; terminatore):

$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000

Tcl (modalità interattiva:tclsh; funzione di output non necessaria, ma expr è):

$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5

Javascript conchiglie:

$ smjs
js> 25/3
8.333333333333334
js>

$ jspl
JSC: 25/3

RP: 8.33333333333333
RJS: [object Number]
JSC:
Good bye...

$ node
> 25/3
8.333333333333334
>

Vari SQL:

SQLite (modalità interattiva:sqlite3 ):

$ sqlite3 <<< 'select 20+5/2;'
22
$ sqlite3 <<< 'select 20+5/2.0;'
22.5

MySQL :

mysql -BNe 'select 1+1'

PostgreSQL :

psql -tAc 'select 1+1

_Le opzioni su mysql e postgres bloccano l'immagine 'ascii art'!

Lingue specializzate orientate alla matematica:

R in modalità normale:generiamo 1000 numeri casuali normali e otteniamo la deviazione standard e la stampiamo

$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997

R usando il piccolo script:consente di stampare pi al quadrato

$ r -e 'cat(pi^2, "n")'
9.869604
$  r -e 'print(sum(1:100))'
[1] 5050

PARI/GP , un vasto sistema di computer algebra per la teoria dei numeri, l'algebra lineare e molte altre cose

$ echo "prime(1000)"|gp -q
7919                        // the 1000th prime
$ echo "factor(1000)" | gp -q
[2 3]
[5 3]                       // 2^3*5^3
$ echo "sum(x=1,5,x)" | gp -q
15                          // 1+2+3+4+5

Ottava GNU (un linguaggio interpretato di alto livello, destinato principalmente ai calcoli numerici)

Supporta anche i numeri complessi:

$ octave
>> 1.2 / 7
ans =  0.17143
>> sqrt(-1)
ans =  0 + 1i

Giulia , interprete e linguaggio ad alte prestazioni per l'informatica scientifica e numerica.

Opzione non interattiva:

$ julia -E '2.5+3.7'
6.2

GhostScript GhostScript è un interprete PostScript, installato molto comunemente anche in distribuzioni molto vecchie.
Consulta la documentazione PostScript per un elenco di comandi matematici supportati.

Esempio interattivo:

$ GS_DEVICE=display gs
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>5 2 div 20 add  =
22.5
GS>

Linux
  1. Come eseguire il debug di uno script Bash?

  2. Come fare eco a un botto!?

  3. Come rilevare Bash>=4.0?

  4. BASH:come eseguire operazioni aritmetiche sui numeri in una pipe

  5. Come verificare se esiste un file in una directory specifica in uno script bash?

Come commentare in Bash

Come utilizzare il comando echo negli script Bash in Linux

Come eseguire uno script Bash

Come fare eco in un file

Come scrivere un numero intero in un file binario usando Bash?

Come posso contare il numero di caratteri in una variabile Bash