Làm thế nào để thực hiện các phép tính số nguyên & float, trong bash hoặc các ngôn ngữ / khung khác?


294

Sử dụng theo echo "20+5"nghĩa đen tạo ra văn bản " 20+5".

Tôi có thể sử dụng lệnh nào để lấy tổng số, 25trong trường hợp này?

Ngoài ra, cách dễ nhất để làm điều đó chỉ là sử dụng bash cho dấu phẩy động? Ví dụ: echo $((3224/3807.0))in 0:(.

Tôi đang tìm kiếm câu trả lời bằng cách sử dụng shell lệnh cơ bản ('dòng lệnh') hoặc thông qua việc sử dụng các ngôn ngữ có sẵn từ dòng lệnh.


1
Nếu bạn đang đi cùng bc, có thể đáng để bạn đọc về -ltùy chọn trong trang người đàn ông.
glenn jackman

Tôi giả sử tác giả đang yêu cầu dòng lệnh bash, trong khi câu trả lời tất cả có xu hướng đa dạng hóa cho tất cả các loại ngôn ngữ kịch bản.
nhấp nháy

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

1
@zinking Vâng, bash được thiết kế để có thể dễ dàng gọi trình thông dịch cho một số lượng lớn ngôn ngữ kịch bản lệnh khác.
Random832

Dạy phân chia số nguyên bash với kết quả dấu phẩy động: stackoverflow.com/a/24431665/3776858
Cyrus

Câu trả lời:


399

Có rất nhiều lựa chọn!!!

Tóm lược

$ 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

Chi tiết

Vỏ ốc

Bạn có thể sử dụng mở rộng số học POSIX cho số học số nguyênecho "$((...))" :

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

Khá di động ( ash dash yash bash ksh93 lksh zsh):
Sử dụng khả năng printf để in nổi, chúng ta có thể mở rộng hầu hết các shell để thực hiện phép toán dấu phẩy động mặc dù trong phạm vi giới hạn (không quá 10 chữ số):

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

ksh93, yashzshlàm nổi hỗ trợ ở đây:

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

chỉ ksh93(trực tiếp) và zshtải thư viện mathfunc tại đây:

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

( zshcần tải zmodload zsh/mathfuncđể có được chức năng như atan).


Tương tác với zsh:

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

Với (t) csh (chỉ số nguyên):

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

Trong họ rcshell, akangalà nhóm có mở rộng số học:

; echo $:25/3
8

Công cụ POSIX

bc(xem bên dưới để biết chế độ tương tác), hướng dẫn tại đây

Mnemonic: best calculator (mặc dù btrên thực tế là cơ bản ).

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

(hỗ trợ số chính xác tùy ý)


chế độ tương tác 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

Giải pháp của Rush , expr(không có chế độ tương tác):

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

Giải pháp của Joshua : awk(không có chế độ tương tác):

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

Các công cụ di động khác ít nhiều

Giải pháp của Arcege , dc(chế độ tương tác dc:):

Điều đó thậm chí còn thú vị hơn vì nó hoạt động bằng ký hiệu đánh bóng ngược.

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

Nhưng không thực tế trừ khi bạn làm việc với ký hiệu đánh bóng ngược rất nhiều.

Lưu ý rằng dccó trước bcbcđã được thực hiện trong lịch sử như là một wrapper xung quanh dcnhưng dcđã không được chuẩn hóa bởi POSIX


DQdims 's calc(bắt buộc sudo apt-get install apcalc):

$ calc 2 + 4
6

Thông dịch viên ngôn ngữ mục đích chung:

Giải pháp của manatwork , node(chế độ tương tác : node; không cần chức năng đầu ra):

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

Perl (chế độ tương tác perl -de 1:):

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

Python (chế độ tương tác : python; không cần chức năng đầu ra):

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

Cũng hỗ trợ số chính xác tùy ý:

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

Nếu bạn đã clispcài đặt, bạn cũng có thể sử dụng ký hiệu đánh bóng:

$ clisp -x "(+ 2 2)"

Giải pháp của Marco , lua(chế độ tương tác lua:):

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

PHP (chế độ tương tác php -a:):

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

Ruby (chế độ tương tác : irb; không cần chức năng đầu ra):

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

Guile (chế độ tương tác guile:):

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

S-Lang (chế độ tương tác : slsh; không cần chức năng đầu ra, chỉ cần một bộ ;kết thúc):

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

Tcl (chế độ tương tác : tclsh; không cần chức năng đầu ra, nhưng exprlà):

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

Vỏ 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
>

Nhiều SQL khác nhau:

SQLite (chế độ tương tác 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

_Các tùy chọn trên mysql và postgres dừng hình ảnh 'nghệ thuật ascii'!

Các ngôn ngữ định hướng toán học chuyên ngành:

R ở chế độ đơn giản - cho phép tạo 1000 số ngẫu nhiên Bình thường và nhận được độ lệch chuẩn và in nó

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

R sử dụng tập lệnh littler - cho phép in bình phương pi

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

PARI / GP , một hệ thống đại số máy tính mở rộng cho lý thuyết số, đại số tuyến tính và nhiều thứ khác

$ 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 (một ngôn ngữ được giải thích ở cấp độ cao, chủ yếu dành cho tính toán số)

Cũng hỗ trợ số phức:

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

Julia , ngôn ngữ hiệu suất cao và thông dịch viên cho máy tính khoa học và số.

Tùy chọn không tương tác:

$ julia -E '2.5+3.7'
6.2

3
và bc thật thú vị: whatis bc-> An arbitrary precision calculator language Thú vị! Cảm ơn!
Michael Durrant

@MichaelDurrant bạn có thể sửa lại các chỉnh sửa của mình không, tôi có phải từ chối do nhầm lẫn không?
lgarzo

4
Ngoài ra còn có dc, điều đó thậm chí còn thú vị hơn vì nó hoạt động bằng ký hiệu đánh bóng ngược. echo 20 5 + p | dc Nhưng không thực tế trừ khi bạn làm việc với ký hiệu đánh bóng ngược rất nhiều.
Arcege

2
Là một biến thể của cách tiếp cận bc, tôi đã thêm hàm sau (mà tôi tìm thấy trên stackexchange ở đâu đó) vào tệp .bashrc của mình. Tôi chỉ có thể nhập calc 2 + 3 và nhận 5. ## Command line calculator calc () { bc -l <<< "$@" }
Joe

1
@Chris, cá là một mục tiêu di chuyển. Họ đang làm việc trên phần mềm mathdựng mới của họ (hoặc bất cứ thứ gì nó được gọi là bây giờ) khi chúng ta nói. Hãy chỉnh sửa. Đó không phải là câu trả lời của tôi và đó là wiki cộng đồng.
Stéphane Chazelas

35

Có nhiều cách để tính toán. Đối với các biểu thức đơn giản, bạn có thể sử dụng bashchính nó:

echo $((20+5))

hoặc expr:

expr 20 + 5

Và đối với các trường hợp phức tạp, có một công cụ tuyệt vời bc:

echo "20+5" | bc

Btw, bc có thể tính toán biểu thức thậm chí rất phức tạp với rễ, logarit, cos, sin, v.v.


Tôi đã thêm exprtùy chọn của bạn vào câu trả lời được chấp nhận. Phải chọn một để chấp nhận và tập trung.
Michael Durrant

3
Bạn đang cố gắng thực hiện expr 20+5. Bạn cần nhập khoảng trắng giữa các số và dấu cộng để làm cho nó hoạt động : expr 20 + 5. Đó là quan trọng.
vội vàng

24

Các giải pháp được đề cập là tốt cho các tính toán rất đơn giản, nhưng rất dễ bị lỗi. Ví dụ:

# 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

Một lỗi cú pháp như những cái cuối cùng dễ dàng được nhận thấy, nhưng các phản hồi số nguyên với phần nổi bị loại bỏ có thể dễ dàng không được chú ý và dẫn đến kết quả sai.

Đó là lý do tại sao tôi luôn sử dụng một ngôn ngữ kịch bản như Lua cho điều đó. Nhưng bạn có thể chọn bất kỳ ngôn ngữ kịch bản nào mà bạn quen thuộc. Tôi chỉ sử dụng Lua làm ví dụ. Những ưu điểm là

  • một cú pháp quen thuộc
  • chức năng quen thuộc
  • hãy cẩn thận
  • đầu vào linh hoạt
  • không gian thường không quan trọng
  • đầu ra điểm nổi

Ví dụ:

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
bcKết quả không phải là số nguyên, chỉ được làm tròn thành scale, giá trị mặc định của ai là 0. Vì vậy, bc <<< 'scale=4;9.0/2.0'nếu bạn muốn phần phân số.
manatwork

Cảm ơn vì sự đúng đắn của bạn. Tuy nhiên, nó dễ bị lỗi. Tôi sẽ nhớ thêm scalenếu tôi sử dụng bctrong một vài tuần? Chắc là không. Và ngay cả khi có cách thay đổi vĩnh viễn, nó sẽ cắn bạn nếu bạn đang ở trên một hệ thống có cài đặt mặc định.
Marco

3
Cá nhân tôi nhớ về scaletừ khi tôi gặp bclần đầu tiên cách đây nhiều năm. Nhưng tôi luôn quên rằng hàm đầu ra luaputhay puts. ;)
manatwork

Chỉ cần đếm bc là một trong những ngôn ngữ kịch bản. Tôi luôn biết liệu tôi có cần kết quả số nguyên hay không - nếu số nguyên vẫn ổn tôi sẽ ở lại bash, nếu không tôi hiếm khi có lý do để sử dụng bc. Đối với lua, bạn phải nhớ -e, in và dấu ngoặc đơn.
người dùng không xác định

7
Chỉ cần luôn luôn sử dụng bc -lchứ không đơn giản bc, sau đó không bao giờ lo lắng về scale.
Dalker

23

Chưa có ai nhắc đến awk?

Sử dụng các hàm shell POSIX và sức mạnh toán học awk, chỉ cần xác định hàm (một dòng) này:

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

Sau đó, chỉ cần thực hiện những thứ như calc 1+1hoặccalc 5/2

Lưu ý: Để làm cho hàm luôn khả dụng, hãy thêm nó vào ~ / .bashrc (hoặc tệp khởi động của shell tương ứng của bạn)

Tất nhiên, một tập lệnh nhỏ có tên "calc" với nội dung sau:

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

cũng có thể làm việc


2
Wow đây là tốt nhất, thậm chí hỗ trợ nổi. Nó hoạt động mà không cần cài đặt bất cứ điều gì!
CMCDragonkai

1
Rất hay, tôi muốn có một so sánh nổi, đây là cách tôi đã làm với sự giúp đỡ của bạn: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

Bạn có thể sử dụng bc. Ví dụ,

$ echo "25 + 5" | bc
30

Hoặc bc <<< 25+5cũng sẽ làm việc.

Hoặc tương tác, nếu bạn muốn làm nhiều hơn chỉ là một phép tính đơn giản:

$ 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

Việc triển khai GNU bcin các thông tin tiêu đề / bản quyền khi khởi động khi cả stdin và stdout của nó đi đến một thiết bị đầu cuối. Bạn có thể loại bỏ nó bằng -qtùy chọn (dành riêng cho GNU) . Để biết thêm thông tin xem trang bc man


1
+1 cho cả hai đường ống ("|") và tùy chọn chế độ tương tác cho bs. Có ai ctrl-dthoát ra không?
Michael Durrant

1
@MichaelDurrant Có, ^ D sẽ thực hiện thủ thuật như ý muốnquit
Levon

c () { bc -l <<< "$@" } sẽ xác định một chức năng c để sử dụng nhanh chóng và dễ dàng. ví dụ như c 3/2sẽ cung cấp cho bạn 1.50000000000000000000. Các liên kết trong ở trên mô tả làm thế nào để làm điều đó là chết.
ijoseph

1
@Levon liên kết trang man vẫn hoạt động. Tuy nhiên, liên kết: paweng.com/2008/08/15/unix-command-line-calculator , mà bạn cung cấp làm mục tiêu của "Điều này" trong câu "Trang này cũng cho thấy cách thiết lập bí danh" xuất hiện đã chết.
ijoseph

1
@ijoseph Cảm ơn .. Tôi đã xóa tham chiếu đến liên kết 6 năm tuổi đó (mong muốn các liên kết nổi bật hơn trên trình duyệt của tôi - thậm chí không nhìn thấy nó khi tôi nhìn vào ngày hôm qua)
Levon

16

Bạn có thể sử dụng calc:

Nếu bạn chỉ nhập calcmà không có đối số nào khác, nó sẽ chuyển sang chế độ tương tác, nơi bạn có thể tiếp tục làm toán. Bạn thoát cái này bằng cách gõ exit:

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

Hoặc bạn sử dụng nó với biểu thức làm đối số và nó sẽ cung cấp câu trả lời và sau đó thoát

$calc 2 + 4
    6
$

calctương tự như bc, tôi chỉ thích cách nó hoạt động như mặc định tốt hơn


1
Bạn không cần phải vào chế độ tương tác, trừ khi bạn đặc biệt muốn, ví dụ: calc -e '2+4; 3+5; 3.4+5; 2^4in 4 dòng đầu ra hoặc chỉ calc -e 33+(3^3).. +1 Tôi thích ý tưởng sử dụng một cái gì đó gọi là 'calc' cho máy tính :)
Peter.O

1
Tôi mới nhận ra rằng -etùy chọn này không cần thiết khi chỉ có một biểu thức ... gọn gàng! ..
Peter.O

10

Tôi thích kích hoạt Python và sử dụng nó như một máy tính tương tác (nhưng một lần nữa, tôi là một lập trình viên Python).


tôi cũng vậy! Python là con dao quân đội Thụy Sĩ của tôi
Levon

Tôi luôn có một cửa sổ screenchỉ chạy Python.
Arcege

1
pythonpy ( github.com/russell91/pythonpy ) là một cách tốt đẹp để làm điều này và những thứ khác trong cú pháp python mà không cần phải cháy lên một vỏ tương tác: py '3.2 * 5' => 16
RussellStewart

Tôi thích python nhưng đó là thời gian khởi động trở nên quan trọng nếu bạn chỉ muốn thêm hai con số ở một vài nơi của kịch bản bash của bạn
ndemou

@ndemou Mình nói máy tính "tương tác". Mặc dù cũng đáng lưu ý rằng tại một số điểm nếu bạn đang thực hiện đủ thứ phức tạp trong một tập lệnh, sự tỉnh táo sẽ ra lệnh bạn sử dụng một cái gì đó khác ngoài bash (như Python).
asmeker

10

Vì không ai khác đã đề cập đến nó, và mặc dù nó không hoàn toàn là một máy tính (nhưng tất cả đều không phải là những ngôn ngữ kịch bản có mục đích chung này), tôi muốn đề cập đến units:

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

Hoặc, với đầu ra ít hơn để bạn có thể chỉ lấy số để sử dụng $()để gán cho thứ gì đó:

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

Và nó thậm chí còn chuyển đổi nhiệt độ

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

Để có được sự chuyển đổi nhiệt độ trong một biểu thức để tính toán thêm, hãy làm điều này:

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

Có rất nhiều tùy chọn không yêu cầu cài đặt một chương trình bổ sung mà tôi không thấy lý do tại sao một người muốn đi theo cách đó.
ndemou

@ndemou Nó được cài đặt theo mặc định trên một số bản phân phối ... và rất nhiều câu trả lời khác không có. Và bạn có thực sự cần phải nhận xét rằng về một câu trả lời năm tuổi không?
Random832

1
Tôi nghĩ thật tốt khi bình luận khi tôi bỏ phiếu và đó là một thực tế cũng được khuyến khích bởi SE Tôi không thấy lý do tại sao năm năm có liên quan. Nhận xét tương tự áp dụng cho tất cả các câu trả lời tương tự - không có gì cá nhân. (BTW ngay cả những chương trình tối nghĩa nhất có thể được được cài đặt theo mặc định trên một số phân phối Trong trường hợp này tôi đã thử nghiệm cài đặt gần đây của Debian, Ubuntu, CentOS và RedHat và các đơn vị không được.)
ndemou

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

Ngoài ra ghci, đó là Trình biên dịch Glasgow-Haskell ở chế độ tương tác ( ghc --interactive, trái ngược với nó đánh giá một biểu thức với -e), tạo nên một "máy tính" hấp dẫn:

$>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
Có phải đó ghccó nghĩa là Trình biên dịch Haskell của Glasgow?
thao tác

vượt qua các chương trình tôi cần cài đặt nhưng thx.
Michael Durrant

4

Tôi không thể tin là đã đọc "sức mạnh của JavaScript" (nhưng tôi đã phải đưa ra câu trả lời cho các phần khác, ngoại trừ perl dĩ nhiên.

Thực tế, đối với các trường hợp đơn giản là số học số nguyên là đủ, tôi sử dụng buildin $ ((...)) và giới thiệu nó. Khác, trong hầu hết các trường hợp tiếng vang "..." | bc là đủ.

Đối với một số hoạt động số học như thống kê, hoạt động ma trận và nhiều hơn nữa Rlà công cụ tốt hơn:

echo 25 + 5 | R --vanilla

và cho các bộ dữ liệu nhỏ và kết quả đồ họa vứt đi, oocalclà một tiện ích tốt đẹp.


4

Tôi sử dụng một tập lệnh python nhỏ sẽ đánh giá biểu thức python và in kết quả, sau đó tôi có thể chạy một cái gì đó như

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

kịch bản là:

#!/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')

Thật không may, tôi không nhớ nơi tôi đã mượn hầu hết các mã từ đó, vì vậy tôi không thể trích dẫn nó.


sẽ không print(eval(' '.join(sys.argv[1:])))làm điều tương tự?
g.rocket

Bạn đang dùng búa để đánh một con ruồi ở đây
ndemou

4

Gnuplot

gnuplot - một chương trình vẽ biểu đồ tương tác
Thực hiện theo liên kết trên hoặc nhậpgnuplotmẫu nhắc nhở sau đóhelpbên trong trìnhthông dịch gnuplot .
Gnuplot là một chương trình sinh ra để vẽ dữ liệu, nhưng cũng có thể được sử dụng để tính toán. Nó cung cấp lợi thế là bạn có thể xác định các hàm và sử dụng các hàm tích hợp.

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 (hoặc một số trình thông dịch C khác )

Các hệ thống ROOT cung cấp một bộ khung OO với tất cả các chức năng cần thiết để xử lý và phân tích một lượng lớn dữ liệu một cách rất hiệu quả ...

Bạn có thể sử dụng nó làm trình thông dịch C , CINT hoặc bạn có thể sử dụng một trong nhiều trình thông dịch C khác . IMHO, nó rất lớn, phức tạp, mạnh mẽ và không phải lúc nào cũng thân thiện nhưng cũng có thể mang lại sự hài lòng lớn.

Nếu bạn thực sự không muốn nghe giọng nói nhỏ bên trong bạn trích dẫn Confucio và bạn đã sẵn sàng để phá vỡ một (bơ) bay trên bánh xe, bạn có thể sử dụng root . Trong trường hợp -lnày là bắt buộc để tránh hiển thị màn hình giật gân ...

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

Đối với số học Integer (trong đó 3/2 = 1)

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

*: và ksh93, yash

Đối với số học dấu phẩy động (trong đó 3/2 = 1,5)

  • bash awk "BEGIN {print 10/3}" (độ chính xác thấp)
  • bash echo "10/3"|bc -l (độ chính xác cao)
  • fish math -s4 10/3
  • zsh* echo $((10./3))

*: và ksh93, yash

Tất nhiên bạn có thể định cấu hình shell của mình để sử dụng awk với kiểu gõ tối thiểu như calc 10/3(xem ghi chú về cách thực hiện cho bash 1 và fish 2 ).

Lý do chính để đề xuất awk cho bash là vì nó được cài đặt sẵn trên hầu hết các hệ điều hành giống Unix và khá nhẹ (tất nhiên là có chi phí bắt đầu một quy trình) với đầu ra ít chính xác hơn nhưng thân thiện với con người hơn bc -lin 20 thập phân chữ số (mặc dù bạn chắc chắn có thể điều chỉnh awk để có thêm chữ số thập phân ).


Ghi chú

(1) Cách sử dụng cú pháp đơn giản hóa trong bash

Thêm chức năng bash này vào ~/.bashrc:

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

(2) Cách sử dụng cú pháp đơn giản hóa trong cá

Tạo một calchàm cá (tức là một tệp văn bản có tên /home/ndemou/.config/fish/functions/calc.fish):

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

awksẽ sử dụng doubleloại dấu phẩy động của hệ thống của bạn , do đó sẽ chính xác như hầu hết các công cụ khác không có độ chính xác tùy ý (lưu ý rằng gawk có thể thực hiện độ chính xác tùy ý). awksử dụng OFMTbiến để chuyển đổi số thành biểu diễn chuỗi của chúng cho đầu ra ( %.6gtheo mặc định, bạn có thể muốn thay đổi điều đó thành %.17gbạn muốn độ chính xác cao hơn ).
Stéphane Chazelas

Lưu ý rằng fish's mathchỉ là một chức năng mà các cuộc gọi bc(mặc dù đó là để thay đổi )
Stéphane Chazelas

1
Vâng, đó là một chức năng mà gọi bc. Nó không còn ở các phiên bản mới hơn, nơi những thứ như math "scale=4; 10/3"sẽ không còn hoạt động nữa ( math -s4 10/3thay vào đó là bây giờ)
Stéphane Chazelas

Cảm ơn Stéphane Chazelas - Tôi đã cập nhật câu trả lời của mình ( math -s4dường như cũng được hỗ trợ trong các phiên bản cũ hơn)
ndemou

3

Để tính toán giao diện điều khiển, tôi sử dụng concalc. ( sudo aptitude install concalc)

Sau đó, chỉ cần gõ concalc và nhấn enter. Nó sẽ không cung cấp lời nhắc, nhưng chỉ cần nhập vào tính toán của bạn (không có khoảng trắng) và nhấn enter, và trên dòng tiếp theo, nó sẽ cung cấp cho bạn giá trị số.


3

SQLite :

echo 'select 1 + 1;' | sqlite3 

MySQL :

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

PostgreSQL :

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

3
Một số chi tiết nhỏ đáng để đề cập: 1) from duallà cần thiết bởi Oracle, MySQL có thể selectkhông có frommệnh đề. 2) PostgreSQL không yêu cầu bí danh. 3) Điều ;này chỉ được yêu cầu bởi SQLite. 4) MySQL và PostgreSQL sẽ chỉ hoạt động nếu chúng có thể kết nối với máy chủ cơ sở dữ liệu. 5) MySQL và PostgreSQL sẽ vẽ bảng nghệ thuật ASCII xung quanh kết quả. Để chỉ nhận giá trị: mysql -BNe 'select 1+1'psql -tAc 'select 1+1.
manatwork

2

Sử dụng Thư viện số học chính xác GNU thông qua run-exprchương trình được cung cấp :

  • Tải xuống và giải nén (bạn sẽ cần lzip): tar -xvf gmp-5.1.3.tar.lz
  • Trong thư mục trên cùng ./configuremake(không cần cài đặt)
  • Trong bản demo / expr, make run-expr
  • Tôi muốn tạo một liên kết tượng trưng đến nó trong ~/binthư mục của tôi :ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr
  • Thêm một bí danh để dễ sử dụng; ví dụ alias calcf='run-expr -f'để đánh giá điểm nổi

Đầu ra:

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

Từ run-expr.ctệp:

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.

Xem hướng dẫn cho sự khác biệt và các lớp chức năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.