GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Melakukan Perhitungan Integer &Float, Dalam Bash Atau Bahasa/kerangka Lainnya?

Menggunakan echo "20+5" secara harfiah menghasilkan teks “20+5 “.

Perintah apa yang dapat saya gunakan untuk mendapatkan jumlah numerik, 25 dalam hal ini?

Juga, apa cara termudah untuk melakukannya hanya dengan menggunakan bash untuk floating
point? Misalnya, echo $((3224/3807.0)) mencetak :(.

Saya mencari jawaban menggunakan shell perintah dasar ('command
line') itu sendiri atau dengan menggunakan bahasa yang tersedia dari
baris perintah.

Jawaban yang Diterima:

Ada banyak pilihan!!!

Ringkasan

$ 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  ="

Detail

Kerang

Anda dapat menggunakan ekspansi aritmatika POSIX untuk bilangan bulat aritmatika echo "$((...))" :

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

Cukup portabel (ash dash yash bash ksh93 lksh zsh ):
Dengan menggunakan kemampuan printf untuk mencetak float, kita dapat memperluas sebagian besar shell untuk melakukan matematika floating point meskipun dengan rentang terbatas (tidak lebih dari 10 digit):

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

ksh93 , yash dan zsh lakukan support float di sini:

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

hanya ksh93 (langsung) dan zsh memuat library mathfunc di sini:

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

(zsh perlu memuat zmodload zsh/mathfunc untuk mendapatkan fungsi seperti atan ).

Secara interaktif dengan zsh:

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

Dengan (t)csh (hanya bilangan bulat):

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

Dalam rc keluarga shell, akanga adalah yang dengan ekspansi aritmatika:

; echo $:25/3
8

kotak alat POSIX

bc (lihat di bawah untuk mode interaktif), manual di sini

Mnemonik:b est c alkulator (meskipun b sebenarnya untuk dasar ).

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

(mendukung angka presisi arbitrer)

bc mode interaktif:

$ 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

Solusi Rush, expr (tidak ada mode interaktif):

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

Solusi Joshua:awk (tidak ada mode interaktif):

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

Alat portabel lainnya yang kurang lebih

Solusi Arcege, dc (mode interaktif:dc ):

Yang bahkan lebih menyenangkan karena bekerja dengan notasi semir terbalik.

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

Tapi tidak sepraktis itu kecuali jika Anda banyak bekerja dengan notasi pemoles terbalik.

Terkait:Melampirkan vs. tidak melampirkan nilai variabel dalam tanda kutip di bash?

calc DQdims (diperlukan sudo apt-get install apcalc) :

$ calc 2 + 4
6

Penerjemah bahasa tujuan umum:

solusi manatwork, node (mode interaktif:node; fungsi keluaran tidak diperlukan):

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

Perl (mode interaktif:perl -de 1 ):

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

Python (mode interaktif:python; fungsi keluaran tidak diperlukan):

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

Juga mendukung angka presisi arbitrer:

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

Jika Anda memiliki clisp terinstal, Anda juga dapat menggunakan notasi polesan:

$ clisp -x "(+ 2 2)"

Solusi Marco, lua (mode interaktif:lua ):

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

PHP (mode interaktif:php -a ):

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

Ruby (mode interaktif:irb; fungsi keluaran tidak diperlukan):

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

Penipuan (mode interaktif:guile ):

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

S-Lang (mode interaktif:slsh; fungsi output tidak diperlukan, cukup ; terminator):

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

Tcl (mode interaktif:tclsh; fungsi output tidak diperlukan, tetapi expr adalah):

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

Javascript cangkang:

$ 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
>

Berbagai SQL:

SQLite (mode interaktif: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

_Opsi pada mysql dan postgres menghentikan gambar 'ascii art'!

Bahasa berorientasi matematika khusus:

B dalam mode biasa – mari kita buat 1000 angka acak Normal dan dapatkan simpangan baku dan cetak

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

B menggunakan kecil skrip – mari cetak pi kuadrat

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

PARI/GP , sistem aljabar komputer ekstensif untuk teori bilangan, aljabar linier, dan banyak hal lainnya

$ 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

GNU Oktaf (bahasa yang ditafsirkan tingkat tinggi, terutama ditujukan untuk perhitungan numerik)

Juga mendukung bilangan kompleks:

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

Julia , bahasa dan juru bahasa berkinerja tinggi untuk komputasi ilmiah dan numerik.

Opsi non-interaktif:

$ julia -E '2.5+3.7'
6.2

GhostScript GhostScript adalah interpreter PostScript, sangat umum diinstal bahkan di distribusi yang sangat lama.
Lihat dokumen PostScript untuk daftar perintah matematika yang didukung.

Contoh interaktif:

$ 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. Bagaimana Cara Men-debug Skrip Bash?

  2. Bagaimana Menggemakan Bang!?

  3. Bagaimana cara menguji apakah suatu variabel adalah angka di Bash?

  1. Bagaimana cara menulis integer ke file biner menggunakan Bash?

  2. Bagaimana saya bisa menghitung jumlah karakter dalam variabel Bash

  3. Bagaimana saya bisa mendapatkan nomor terakhir dari string di bash?

  1. Cara menggunakan perintah riwayat Bash

  2. Bagaimana Cara Mendeteksi Bash>=4.0?

  3. Cara menggemakan Baris Baru di Bash Shell Script