Bagaimana cara melakukan perhitungan integer & float, dalam bash atau bahasa / kerangka kerja lainnya?


294

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

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

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

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


1
Jika Anda ikut bc, mungkin ada baiknya Anda membaca tentang -lopsi di halaman manual.
glenn jackman

Saya menganggap penulis meminta baris perintah bash, sementara jawaban semua cenderung beragam untuk semua jenis bahasa scripting.
zinking

2
man bash → / ekspresi
ДМИТРИЙ МАЛИКОВ

1
@ zinking Yah, bash dirancang agar dapat dengan mudah memanggil penerjemah untuk sejumlah besar bahasa scripting lainnya.
Random832

Ajari divisi bash integer dengan hasil floating point: stackoverflow.com/a/24431665/3776858
Cyrus

Jawaban:


399

Ada banyak pilihan!!!

Ringkasan

$ printf %.10f\\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ echo "$((20.0/7))"                       # (ksh93/zsh/yash, not 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

Detail

Kerang

Anda dapat menggunakan ekspansi aritmatika POSIX untuk aritmatika integerecho "$((...))" :

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

Quite portable ( ash dash yash bash ksh93 lksh zsh):
Menggunakan kemampuan printf untuk mencetak floats, kami 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, yashdan zshlakukan dukungan mengapung di sini:

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

hanya ksh93(langsung) dan zshmemuat fungsi perpustakaan perpustakaan di sini:

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

( zshperlu memuat zmodload zsh/mathfuncuntuk 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 rckeluarga shell, akangaadalah satu dengan ekspansi aritmatika:

; echo $:25/3
8

Toolest POSIX

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

Mnemonic: best calculator (meskipun bsebenarnya untuk dasar ).

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

(mendukung angka presisi acak)


mode interaktif bc:

$ 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(tanpa 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 kurang lebih

Solusi Arcege , dc(mode interaktif :)dc :

Yang bahkan lebih menyenangkan karena ia bekerja dengan notasi polish terbalik.

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

Tetapi tidak praktis jika Anda tidak banyak bekerja dengan notasi polish terbalik.

Perhatikan bahwa ada dcsebelum bcdan bctelah secara historis diterapkan sebagai pembungkus dctetapi dctidak dibakukan oleh POSIX


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

$ calc 2 + 4
6

Penerjemah bahasa tujuan umum:

solusi manatwork , node(mode interaktif :;node fungsi output 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 output 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 acak:

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

Jika sudah clispmenginstal, Anda juga dapat menggunakan notasi semir:

$ 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 output tidak diperlukan):

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

Tipu muslihat (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, hanya ;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 expradalah):

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

Kerang Javascript :

$ 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

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

Bahasa berorientasi matematika khusus:

R dalam mode biasa - memungkinkan menghasilkan 1000 angka acak Normal dan mendapatkan simpangan baku dan mencetaknya

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

R menggunakan skrip littler - memungkinkan cetak pi kuadrat

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

PARI / GP , sistem aljabar komputer yang luas 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 Octave (bahasa interpretasi 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 kinerja tinggi dan juru bahasa untuk komputasi ilmiah dan numerik.

Opsi non-interaktif:

$ julia -E '2.5+3.7'
6.2

3
dan bc menarik: whatis bc-> An arbitrary precision calculator language Menarik! Terima kasih!
Michael Durrant

@MichaelDurrant, bisakah Anda merevisi kembali suntingan Anda, saya pasti menolak karena kesalahan?
lgarzo

4
Ada juga dc, yang bahkan lebih menyenangkan karena bekerja dengan notasi polish terbalik. echo 20 5 + p | dc Tetapi tidak praktis jika Anda tidak banyak bekerja dengan notasi polish terbalik.
Arcege

2
Sebagai variasi pada pendekatan bc, saya menambahkan fungsi berikut (yang saya temukan di stackexchange di suatu tempat) ke file .bashrc saya. Saya hanya bisa memasukkan calc 2 + 3 dan mendapatkan 5. ## Command line calculator calc () { bc -l <<< "$@" }
Joe

1
@ Chris, ikan adalah target yang bergerak. Mereka sedang mengerjakan mathbuiltin baru mereka (atau apa pun namanya sekarang) saat kita bicara. Jangan ragu untuk mengedit. Itu bukan jawaban saya dan itu adalah wiki komunitas.
Stéphane Chazelas

35

Ada banyak cara untuk menghitung. Untuk ekspresi sederhana, Anda dapat menggunakannya bashsendiri:

echo $((20+5))

atau expr:

expr 20 + 5

Dan untuk kasus rumit ada alat yang hebat bc:

echo "20+5" | bc

Btw, bc dapat menghitung bahkan ekspresi yang sangat kompleks dengan akar, logaritma, cos, dosa dan sebagainya.


Saya menambahkan expropsi Anda ke jawaban yang diterima. Harus memilih satu untuk menerima dan memusatkan.
Michael Durrant

3
Anda mencoba mengeksekusi expr 20+5. Anda perlu mengetik spasi antara angka dan ditambah untuk membuatnya bekerja: expr 20 + 5. Itu penting.
buru

24

Solusi yang disebutkan baik untuk perhitungan yang sangat sederhana, tetapi sangat rawan kesalahan. Contoh:

# without spaces expr 20+5 produces literally 20+5
expr 20+5
 20+5

# bc's result doesn't give the fractional part by default
bc <<< 9.0/2.0
 4

# expr does only integer
expr 9 / 2
 4

# same for POSIX arithmetic expansion
echo $((9/2))
 4

# bash arithmetic expansion chokes on floats
echo $((9.0/2.0))
 bash: 9/2.0: syntax error: invalid arithmetic operator (error token is ".0")

# Most `expr` implementations also have problems with floats
expr 9.0 / 2.0
 expr: non-integer argument

Kesalahan sintaksis seperti yang terakhir mudah diketahui, tetapi respons bilangan bulat dengan bagian float yang dibuang dapat dengan mudah diketahui dan menyebabkan hasil yang salah.

Itu sebabnya saya selalu menggunakan bahasa scripting seperti Lua untuk itu. Tetapi Anda dapat memilih bahasa skrip apa pun yang Anda kenal. Saya hanya menggunakan Lua sebagai contoh. Keuntungannya adalah

  • sintaks yang akrab
  • fungsi yang biasa
  • peringatan akrab
  • input fleksibel
  • ruang biasanya tidak penting
  • output titik mengambang

Contoh:

lua -e "print(9/2)"
 4.5

lua -e "print(9 / 2)"
 4.5

lua -e "print(9.0/2)"
 4.5

lua -e "print (9 /2.)"
 4.5

lua -e "print(math.sqrt(9))"
 3

2
bcHasilnya bukan bilangan bulat, hanya dibulatkan ke scale, yang nilai defaultnya adalah 0. Jadi bc <<< 'scale=4;9.0/2.0'jika Anda ingin bagian pecahan.
manatwork

Terima kasih atas koreksinya. Tapi tetap saja, itu rawan kesalahan. Akankah saya ingat untuk menambahkan scalejika saya gunakan bcdalam beberapa minggu? Mungkin tidak. Dan bahkan jika ada cara untuk mengubahnya secara permanen, itu akan menggigit Anda jika Anda berada di sistem dengan pengaturan default.
Marco

3
Secara pribadi saya ingat scalesejak saya bertemu bcpertama kali tahun lalu. Tapi aku selalu lupa apakah fungsi output dalam luaadalah putatau puts. ;)
manatwork

Hitung saja bc sebagai salah satu bahasa skrip. Saya selalu tahu apakah saya perlu hasil integer atau tidak - jika integer baik-baik saja saya tetap di bash, kalau tidak saya jarang punya alasan untuk menggunakan bc. Untuk lua, Anda harus ingat -e, cetak, dan tanda kurung.
pengguna tidak diketahui

7
Hanya selalu menggunakan bc -ldaripada biasa bc, maka jangan pernah khawatir scale.
Dalker

23

Belum ada yang menyebut awk?

Menggunakan fungsi shell POSIX, dan kekuatan matematika awk, cukup tentukan fungsi (satu baris) ini:

calc(){ awk "BEGIN { print $*}"; }

Kemudian jalankan saja hal-hal seperti calc 1+1ataucalc 5/2

Catatan: Untuk membuat fungsi selalu tersedia, tambahkan ke ~ / .bashrc (atau file startup shell Anda yang sesuai)

Tentu saja, skrip kecil bernama "calc" dengan konten berikut:

#!/bin/sh -
awk "BEGIN { print $* }"

bisa juga bekerja.


2
Wow ini yang terbaik, bahkan mendukung pelampung. Ini berfungsi tanpa menginstal apa pun!
CMCDragonkai

1
Sangat bagus, saya ingin memiliki perbandingan mengambang, di sini adalah bagaimana saya melakukannya dengan bantuan Anda:a=0; b=0.0; if echo "$a" "$b" | awk '{ exit ($1 == $2) ? 0 : 1 }'; then echo 'equals'; else echo 'not equals'; fi
Paul Tobias

18

Anda bisa menggunakannya bc. Misalnya,

$ echo "25 + 5" | bc
30

Atau bc <<< 25+5juga akan bekerja.

Atau secara interaktif, jika Anda ingin melakukan lebih dari satu perhitungan sederhana:

$ 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'. 
25 + 5
30

Implementasi GNU dari bccetakan yang header / info hak cipta saat start-up ketika stdin dan stdout pergi ke terminal. Anda dapat menekannya dengan opsi (khusus GNU) -q. Untuk informasi lebih lanjut lihat halaman manual bc


1
+1 untuk opsi pipa ("|") dan mode interaktif untuk bs. Apakah ada yang ctrl-dkeluar?
Michael Durrant

1
@MichaelDurrant Ya, ^ D akan melakukan trik seperti yang quit
diinginkan

c () { bc -l <<< "$@" } akan menentukan fungsi c untuk penggunaan yang cepat dan mudah. misalnya c 3/2akan memberi Anda 1.50000000000000000000. Tautan di atas menjelaskan cara melakukannya sudah mati.
ijoseph

1
@Levon tautan halaman manual masih berfungsi. Namun, tautan: paweng.com/2008/08/15/unix-command-line-calculator , yang Anda berikan sebagai target "Ini" dalam kalimat "Halaman ini juga menunjukkan cara mengatur alias ..." muncul mati.
ijoseph

1
@ijoseph Terima kasih .. Saya menghapus referensi ke tautan berusia 6 tahun itu (semoga tautannya terlihat lebih jelas di browser saya - bahkan tidak melihatnya ketika saya melihat kemarin)
Levon

16

Anda bisa menggunakan calc:

Jika Anda hanya memasukkan calctanpa argumen lain itu memasuki mode interaktif di mana Anda bisa terus melakukan matematika. Anda keluar dari ini dengan mengetikkan keluar:

C-style arbitrary precision calculator (version 2.12.3.3)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 2+4
6
; 3+5
8
; 3.4+5
8.4
; 2^4
16
; exit

Atau Anda menggunakannya dengan ekspresi sebagai argumen dan itu akan memberikan jawaban dan kemudian keluar

$calc 2 + 4
    6
$

calcmirip dengan bc, saya hanya suka cara berperilaku sebagai default lebih baik


1
Anda tidak perlu masuk ke mode interaktif, kecuali jika Anda ingin, misalnya: calc -e '2+4; 3+5; 3.4+5; 2^4mencetak 4 jalur output, atau hanya calc -e 33+(3^3).. +1 Saya menyukai gagasan menggunakan sesuatu yang disebut 'calc' untuk kalkulator :)
Peter.O

1
Saya baru menyadari bahwa -eopsi tidak diperlukan ketika hanya ada satu ekspresi ... rapi! ..
Peter.O

10

Saya suka menyalakan Python dan menggunakannya sebagai kalkulator interaktif (tapi sekali lagi, saya seorang programmer Python).


saya juga! Python adalah pisau tentara swiss saya
Levon

Saya selalu memiliki satu jendela screenhanya dengan menjalankan Python.
Arcege

1
pythonpy ( github.com/russell91/pythonpy ) adalah cara yang bagus untuk melakukan ini dan hal-hal lain dalam sintaksis python tanpa harus menjalankan shell interaktif: py '3.2 * 5' => 16
RussellStewart

Saya suka python tetapi waktu start up menjadi penting jika Anda hanya ingin menambahkan dua angka di beberapa tempat skrip bash Anda
ndemou

@ndou aku bilang kalkulator "interaktif". Meskipun perlu juga dicatat bahwa pada titik tertentu jika Anda melakukan hal-hal yang cukup kompleks dalam sebuah skrip, kewarasan menentukan Anda menggunakan sesuatu selain bash (seperti Python).
asmeurer

10

Karena tidak ada orang lain yang menyebutkannya, dan meskipun ini bukan sepenuhnya kalkulator (tetapi tidak semua bahasa scripting untuk tujuan umum ini), saya ingin menyebutkan units:

$ units "1 + 1"
        Definition: 2
$ units "1 lb" "kg"
        * 0.45359237
         / 2.2046226

Atau, untuk output yang lebih sedikit sehingga Anda bisa mendapatkan nomor yang akan digunakan $()untuk menetapkan sesuatu:

$ units -t "1 + 1"
2
$ units -t "1 lb" "kg"
0.4539237

Dan bahkan konversi suhu

$ units -t "tempC(20)" "tempF"
68

Untuk mendapatkan konversi suhu dalam ekspresi untuk perhitungan lebih lanjut, lakukan ini:

$ units -t "~tempF(tempC(20))+1"
68.1

Ada begitu banyak opsi yang tidak perlu menginstal program tambahan sehingga saya tidak mengerti mengapa orang ingin seperti itu.
ndemou

@ndemou Ini terinstal secara default pada beberapa distribusi ... dan banyak dari jawaban lain ini tidak. Dan apakah Anda benar-benar perlu mengomentari jawaban yang berusia lima tahun?
Random832

1
Saya pikir itu baik untuk berkomentar ketika saya memilih dan itu adalah praktik yang juga didorong oleh SE Saya tidak melihat mengapa lima tahun relevan. Komentar yang sama berlaku untuk semua jawaban yang serupa - tidak ada yang pribadi. (BTW bahkan program yang paling tidak jelas dapat diinstal secara default pada beberapa distribusi. Dalam hal ini saya telah menguji instalasi terbaru Debian, Ubuntu, CentOS dan RedHat dan unit tidak)
ndemou

6
$> ghc -e '20 + 5'
25
it :: Integer

Juga ghci, itu adalah Glasgow-Haskell Compiler dalam mode interaktif ( ghc --interactive, yang bertentangan dengan itu mengevaluasi ekspresi dengan -e), membuat "kalkulator" yang menarik:

$>ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> pi
3.141592653589793
Prelude> ceiling pi
4
Prelude> compare 1 2
LT

3
Apakah itu ghcartinya Glasgow Haskell Compiler?
manatwork

mengambil lulus pada program saya perlu menginstal tetapi terima kasih.
Michael Durrant

4

Saya tidak percaya untuk membaca "kekuatan JavaScript" (tapi saya harus membatalkan jawaban untuk bagian lain, kecuali perl tentu saja.

Secara praktis, untuk kasus-kasus sederhana di mana aritmatika integer cukup, saya menggunakan $ buildin ((...)) dan merekomendasikannya. Lain, dalam hampir semua kasus gema "..." | bc sudah cukup.

Untuk beberapa operasi aritmatika seperti statistik, operasi matriks, dan lainnya Radalah alat yang lebih baik:

echo 25 + 5 | R --vanilla

dan untuk dataset kecil dan hasil grafis yang dibuang, oocalcadalah utilitas yang bagus.


4

Saya menggunakan skrip python kecil yang akan mengevaluasi ekspresi python dan mencetak hasilnya, maka saya dapat menjalankan sesuatu seperti

$ pc '[i ** 2 for i in range(10)]'
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

skripnya adalah:

#!/usr/local/bin/python3

import sys
import traceback
from codeop import CommandCompiler

compile = CommandCompiler()
filename = "<input>"
source = ' '.join(sys.argv[1:]) + '\n'

try:
    code = compile(source, filename) 
except (OverflowError, SyntaxError, ValueError):
    type, value, sys.last_traceback = sys.exc_info()
    sys.last_type = type
    sys.last_value = value
    if filename and type is SyntaxError:
        # Work hard to stuff the correct filename in the exception
        try:
            msg, (dummy_filename, lineno, offset, line) = value.args
        except ValueError:
            # Not the format we expect; leave it alone
            pass
        else:
            # Stuff in the right filename
            value = SyntaxError(msg, (filename, lineno, offset, line))
            sys.last_value = value
    lines = traceback.format_exception_only(type, value)
    print(''.join(lines))
else:
    if code:
        exec(code)
    else:
        print('incomplete')

Sayangnya saya tidak ingat dari mana saya meminjam sebagian besar kode, jadi saya tidak bisa mengutipnya.


tidak akan print(eval(' '.join(sys.argv[1:])))melakukan hal yang sama?
g.rocket

Anda menggunakan palu untuk memukul lalat di sini
ndemou

4

Gnuplot

gnuplot - program merencanakan interaktif
Ikuti tautan di atas atau ketikgnuplotform prompt kemudianhelpdi dalaminterpreter gnuplot .
Gnuplot adalah program yang lahir untuk memplot data, tetapi juga dapat digunakan untuk perhitungan. Ini menawarkan keuntungan bahwa Anda dapat mendefinisikan fungsi dan atau menggunakan yang built-in.

echo  "pr 20+5/2"  |  gnuplot          #  Lazy-note `pr` instead of print
22                                     #  Integer calculation & result
echo  "pr 20.+5/2"  |  gnuplot         #  Lazy-note `pr` instead of print
22.0                                   #  Floating point result
echo  "pr sin(2*pi/3.)"  |  gnuplot    #  Some functions ...
0.866025403784439

Root (atau juru bahasa C lainnya )

Sistem ROOT menyediakan seperangkat kerangka kerja OO dengan semua fungsionalitas yang diperlukan untuk menangani dan menganalisis sejumlah besar data dengan cara yang sangat efisien ...

Anda dapat menggunakannya sebagai interpreter C , CINT , atau Anda dapat menggunakan salah satu dari banyak banyak juru bahasa C lainnya . IMHO, itu besar, kompleks, kuat, dan tidak selalu ramah tetapi dapat memberikan kepuasan besar juga.

Jika Anda benar-benar tidak ingin mendengarkan suara kecil di dalam diri Anda yang mengutip Confucio dan Anda siap untuk mematahkan (mentega) lalat di atas roda Anda dapat menggunakan root . Dalam hal -lini wajib untuk menghindari menampilkan layar splash ...

echo  "20+5/2"   | root -l
(const int)22
echo  "20+5/2."  | root -l
(const double)2.25000000000000000e+01

echo  "cout<< 20+5/2 << endl;"   | root -l
22

4

Untuk hitung bilangan bulat (di mana 3/2 = 1)

  • bash echo $(( 1+1 ))
  • fish math 1+1
  • zsh* echo $((1+1))

*: dan ksh93, yash

Untuk aritmatika floating point (di mana 3/2 = 1.5)

  • bash awk "BEGIN {print 10/3}" (presisi rendah)
  • bash echo "10/3"|bc -l (presisi tinggi)
  • fish math -s4 10/3
  • zsh* echo $((10./3))

*: dan ksh93, yash

Anda tentu saja dapat mengkonfigurasi shell Anda untuk menggunakan awk dengan mengetik seperti minimum calc 10/3(lihat catatan tentang bagaimana melakukannya untuk bash 1 dan fish 2 ).

Alasan utama untuk menyarankan awk untuk bash adalah karena sudah diinstal pada hampir semua OS mirip Unix dan cukup ringan (tentu saja ada biaya memulai proses) dengan output bc -lyang kurang tepat tetapi lebih ramah manusia daripada yang mencetak 20 desimal digit (meskipun Anda tentu saja dapat mengubah awk untuk mendapatkan lebih banyak angka desimal ).


Catatan

(1) Cara menggunakan sintaks yang disederhanakan dalam bash

Tambahkan fungsi bash ini ke ~/.bashrc:

calc(){ awk "BEGIN { print $*}"; }

(2) Cara menggunakan sintaks yang disederhanakan pada ikan

Buat calcfungsi ikan (yaitu file teks bernama /home/ndemou/.config/fish/functions/calc.fish):

function calc
    awk "BEGIN{ print $argv }" ;
end

awkakan menggunakan doubletipe floating point sistem Anda , jadi akan sama akuratnya dengan sebagian besar alat lain yang tidak melakukan presisi sembarang (perhatikan bahwa gawk dapat melakukan presisi sembarang). awkmenggunakan OFMTvariabel untuk mengonversi angka ke representasi string mereka untuk keluaran ( %.6gsecara default, Anda mungkin ingin mengubahnya menjadi %.17gAnda menginginkan presisi yang lebih tinggi ).
Stéphane Chazelas

Perhatikan bahwa fishitu mathhanya fungsi yang memanggil bc(meskipun itu akan berubah )
Stéphane Chazelas

1
Ya, itu adalah fungsi yang memanggil bc. Ini tidak lagi dalam versi yang lebih baru di mana hal-hal seperti math "scale=4; 10/3"tidak akan berfungsi lagi ( math -s4 10/3bukan sekarang)
Stéphane Chazelas

Terima kasih Stéphane Chazelas - Saya telah memperbarui jawaban saya ( math -s4tampaknya didukung dalam versi yang lebih lama juga)
ndemou

3

Untuk perhitungan konsol, saya menggunakan concalc. ( sudo aptitude install concalc)

Setelah itu, cukup ketik concalc dan tekan enter. Itu tidak akan memberikan prompt, tetapi cukup ketik dalam perhitungan Anda (tanpa spasi) dan tekan enter, dan pada baris berikutnya, itu akan memberi Anda nilai numerik.


3

SQLite :

echo 'select 1 + 1;' | sqlite3 

MySQL :

mysql -e 'select 1 + 1 from dual;'

PostgreSQL :

psql -c 'select 1 + 1 as sum;'

3
Beberapa detail kecil yang perlu disebutkan: 1) from dualdiperlukan oleh Oracle, MySQL dapat selecttanpa fromklausa. 2) PostgreSQL tidak membutuhkan alias. 3) ;Hanya diperlukan oleh SQLite. 4) MySQL dan PostgreSQL hanya akan berfungsi jika mereka dapat terhubung ke server database. 5) MySQL dan PostgreSQL akan menggambar tabel ASCII-art di sekitar hasilnya. Untuk hanya mendapatkan nilai: mysql -BNe 'select 1+1'dan psql -tAc 'select 1+1.
manatwork

2

Gunakan Perpustakaan Aritmatika Presisi Ganda GNU melalui run-exprprogram yang disediakan :

  • Unduh dan ekstrak (Anda perlu lzip): tar -xvf gmp-5.1.3.tar.lz
  • Di direktori teratas, ./configuredan make(tidak perlu menginstal)
  • Dalam demo / expr, make run-expr
  • Saya suka membuat tautan simbolis ke ~/bindirektori saya :ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr
  • Tambahkan alias untuk mudah digunakan; misalnya alias calcf='run-expr -f'untuk evaluasi floating point

Keluaran:

# calcf '2/3'
"2/3" base 0: result 0.666666666666666666667e0

Dari run-expr.cfile:

Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...

   Evaluate each argument as a simple expression.  By default this is in mpz
   integers, but -q selects mpq or -f selects mpf.  For mpf the float
   precision can be set with -p.  In all cases the input base can be set
   with -b, or the default is "0" meaning decimal with "0x" allowed.

Lihat manual untuk perbedaan dan detail kelas fungsi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.