[unix] bash 또는 다른 언어 / 프레임 워크에서 정수 및 부동 소수점 계산을 수행하는 방법은 무엇입니까?

사용 echo "20+5"문자 그대로하면 텍스트를 “생산 20+5“.

25이 경우 숫자 합계를 얻기 위해 어떤 명령을 사용할 수 있습니까?

또한 부동 소수점에 bash를 사용하는 가장 쉬운 방법은 무엇입니까? 예를 들어, echo $((3224/3807.0))인쇄 0:(.

기본 명령 셸 ( ‘명령 줄’) 자체를 사용하거나 명령 줄에서 사용할 수있는 언어를 사용하여 답을 찾고 있습니다.



답변

많은 옵션이 있습니다 !!!

요약

$ 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

세부

포탄

정수 산술에 POSIX 산술 확장을 사용할 수 있습니다 echo "$((...))".

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

이식성 ( ash dash yash bash ksh93 lksh zsh) :
printf 기능을 사용하여 부동 소수점을 인쇄하면 제한된 범위 (10 자리 이하)로 부동 소수점 연산을 수행하도록 대부분의 쉘을 확장 할 수 있습니다.

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

ksh93, yash그리고 zsh여기에 지원 수레를 수행합니다

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

라이브러리 mathfunc 만 ksh93(직접) zsh로드하는 경우 :

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

( 와 같은 기능 zsh을 사용하려면로드해야합니다 ).zmodload zsh/mathfuncatan


zsh와 대화식으로 :

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

(t) csh 사용 (정수만 해당) :

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

에서 rc쉘 가족, akanga연산 확장과 하나입니다 :

; echo $:25/3
8

POSIX 툴 체스트

bc(대화식 모드는 아래 참조), 매뉴얼은 여기

니모닉 : best calculator ( b실제로는 basic입니다 ).

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

(임의의 정밀도 숫자 지원)


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

Rush 의 솔루션 expr(대화식 모드 없음) :

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

Joshua의 해결책 : awk(대화식 모드 없음) :

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

다른 다소 휴대용 도구

Arcege 의 솔루션 dc(대화식 모드 🙂dc :

역 연마 표기법으로 작동하기 때문에 훨씬 더 재미 있습니다.

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

그러나 리버스 광택 표기법을 많이 사용하지 않으면 실용적이지 않습니다.

참고 dc선행 bcbc역사적 래퍼로 구현되어 dc있지만, dcPOSIX에 의해 표준화되지 않았습니다


DQdims 의은 calc(필수 sudo apt-get install apcalc):

$ calc 2 + 4
6

범용 언어 통역사 :

manatwork 의 솔루션 node(대화식 모드 : node; 출력 기능 불필요) :

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

Perl (대화식 모드 🙂perl -de 1 :

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

파이썬 (대화식 모드 : python; 출력 기능 불필요) :

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

임의의 정밀도 숫자도 지원합니다.

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

당신이 경우 clisp설치, 당신은 또한 폴란드 표기법을 사용할 수 있습니다 :

$ clisp -x "(+ 2 2)"

Marco 의 솔루션 lua(대화식 모드 🙂lua :

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

PHP (대화식 모드 🙂php -a :

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

루비 (대화식 모드 : irb; 출력 기능 불필요) :

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

Guile (대화식 모드 🙂guile :

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

S-Lang (대화식 모드 : slsh; 출력 기능 불필요, ;터미네이터) :

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

Tcl (대화식 모드 : tclsh; 출력 기능 expr은 필요하지 않지만 ) :

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

자바 스크립트 쉘 :

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

다양한 SQL :

SQLite (대화식 모드 🙂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

_mysql과 postgres의 옵션은 ‘아스키 아트’이미지를 멈 춥니 다!

전문 수학 중심 언어 :

일반 모드의 R -1000 개의 정규 난수를 생성하고 표준 편차를 가져 와서 인쇄합니다.

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

R 은 Using 의 littler 스크립트 – 제곱 인쇄 파이를 할 수 있습니다

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

PARI / GP , 수 이론, 선형 대수 및 기타 여러 가지를위한 광범위한 컴퓨터 대수 시스템

$ 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 (고급 해석 언어, 주로 수치 계산 용)

복소수도 지원합니다.

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

Julia 는 과학 및 수치 컴퓨팅을위한 고성능 언어 및 통역사입니다.

비 대화식 옵션 :

$ julia -E '2.5+3.7'
6.2


답변

계산하는 방법에는 여러 가지가 있습니다. 간단한 표현식의 경우 bash자체 를 사용할 수 있습니다 .

echo $((20+5))

또는 expr:

expr 20 + 5

복잡한 경우에는 훌륭한 도구가 있습니다 bc.

echo "20+5" | bc

Btw, bc는 근, 대수, cos, sin 등으로 매우 복잡한 표현을 계산할 수 있습니다.


답변

언급 된 솔루션은 매우 간단한 계산에는 적합하지만 오류가 발생하기 쉽습니다. 예 :

# 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

마지막 오류와 같은 구문 오류는 쉽게 알 수 있지만 삭제 된 부동 부분에 대한 정수 응답은 쉽게 눈에 띄지 않고 잘못된 결과를 초래할 수 있습니다.

그렇기 때문에 항상 Lua와 같은 스크립팅 언어를 사용합니다. 그러나 익숙한 스크립팅 언어를 선택할 수 있습니다. 난 그냥 예를 들어 루아를 사용합니다. 장점은

  • 익숙한 구문
  • 익숙한 기능
  • 익숙한 경고
  • 유연한 입력
  • 공백은 일반적으로 중요하지 않습니다
  • 부동 소수점 출력

예 :

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


답변

아직 awk를 언급 한 사람이 없습니까?

POSIX 쉘 함수와 awk math power를 사용하여 다음 (한 줄) 함수를 정의하십시오.

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

그런 다음 calc 1+1또는calc 5/2

참고 : 기능을 항상 사용 가능하게하려면 ~ / .bashrc (또는 해당 쉘의 시작 파일)에 추가하십시오.

물론 다음 내용을 가진 “calc”라는 작은 스크립트가 있습니다.

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

작동 할 수도 있습니다.


답변

사용할 수 있습니다 bc. 예 :

$ echo "25 + 5" | bc
30

대안으로 bc <<< 25+5작동합니다.

또는 단순한 단일 계산 이상을 수행하려는 경우 대화식으로 :

$ 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

GNU 구현은 bcstdin과 stdout이 모두 터미널로 갈 때 시작시 해당 헤더 / 저작권 정보를 인쇄합니다. (GNU 특정) -q옵션으로 억제 할 수 있습니다 . 자세한 내용은 bc 매뉴얼 페이지를 참조하십시오


답변

당신은 사용할 수 있습니다 calc:

방금 입력하면 calc다른 인수는 그냥 수학을 일을 계속 할 수있는 대화 형 모드로 들어갑니다. 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

또는 식을 인수로 사용하면 답을 제공 한 다음 종료됩니다.

$calc 2 + 4
    6
$

calc와 비슷합니다 bc. 기본 동작 방식이 더 좋습니다.


답변

나는 파이썬을 시작하고 그것을 대화 형 계산기로 사용하는 것을 좋아합니다 (그러나 다시 파이썬 프로그래머입니다).