it-swarm-ko.tech

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

echo "20+5"를 사용하면 문자 그대로 "20+5"가 생성됩니다.

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

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

기본 명령 셸 ( '명령 줄') 자체를 사용하거나 명령 줄에서 사용 가능한 언어를 사용하여 답을 찾고 있습니다.

316
Michael Durrant

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

echo $((20+5))

또는 expr :

expr 20 + 5

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

echo "20+5" | bc

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

37
rush

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

# 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를 사용합니다. 장점은

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

예 :

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
25
Marco

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

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

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

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

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

물론 다음과 같은 내용의 "calc"라는 작은 스크립트가 있습니다.

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

작동 할 수도 있습니다.

25
Joshua

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 bc 구현은 stdin과 stdout이 모두 터미널로 갈 때 시작시 해당 헤더/저작권 정보를 인쇄합니다. ) -q 옵션. 자세한 내용은 bc man page 를 참조하십시오.

18
Levon

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
$

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

17
DQdlM

나는 Python을 시작하고 그것을 대화 형 계산기로 사용하고 싶습니다 (그러나 다시, 저는 Python 프로그래머)입니다).

10
asmeurer

아무도 언급하지 않았으며, 계산기가 아니지만 (그러나 이러한 범용 스크립팅 언어는 아닙니다) units에 대해 언급하고 싶습니다.

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

또는 출력을 줄이려면 $()에서 사용할 숫자 만 사용하여 무언가를 지정할 수 있습니다.

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

온도 변환도

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

추가 계산을 위해 표현식에서 온도 변환을 얻으려면 다음을 수행하십시오.

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

정수 산술 (3/2 = 1)

  • bashecho $(( 1+1 ))
  • fishmath 1+1
  • zsh*echo $((1+1))

* : 그리고 ksh93, yash

부동 소수점 산술 (여기서 3/2 = 1.5)

  • bashawk "BEGIN {print 10/3}"(낮은 정밀도)
  • bashecho "10/3"|bc -l(고정밀)
  • fishmath -s4 10/3
  • zsh*echo $((10./3))

* : 그리고 ksh93, yash

물론 calc 10/3와 같이 최소한의 입력으로 awk를 사용하도록 쉘을 구성 할 수 있습니다 (bash에 대해 수행하는 방법에 대한 참고 사항 참조)1 그리고 물고기2).

Bash에 awk를 제안하는 주된 이유는 거의 모든 유닉스 계열 OS에 사전 설치되어 있으며 bc -l는 20 개의 10 진수를 인쇄합니다 (물론 더 많은 10 진수를 얻기 위해 awk를 조정 ).


노트

(1) bash에서 단순화 된 구문을 사용하는 방법

이 bash 함수를 ~/.bashrc에 추가하십시오.

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

(2) 어류에서 단순화 된 구문을 사용하는 방법

calc fish 함수 (예 : /home/ndemou/.config/fish/functions/calc.fish라는 텍스트 파일)를 만듭니다.

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

나는 python 식을 평가하고 결과를 인쇄하는 작은 python 스크립트)를 사용하면 다음과 같은 것을 실행할 수 있습니다

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

스크립트는 다음과 같습니다

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

불행히도 나는 대부분의 코드를 어디서 빌 렸는지 기억하지 못하므로 인용 할 수 없습니다.

4
cobbal

그노 플롯

gnuplot-대화식 플로팅 프로그램
위 링크를 따르거나 gnuplot을 입력 한 후 프롬프트에서 help을 입력 한 다음 gnuplot 인터프리터 안에 입력하십시오.
Gnuplot 데이터를 플롯하기 위해 태어난 프로그램이지만 계산에도 사용할 수 있습니다. 기능을 정의하거나 내장 기능을 사용할 수 있다는 이점을 제공합니다.

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

루트 (또는 다른 C 인터프리터)

ROOT 시스템 은 대량의 데이터를 매우 효율적으로 처리하고 분석하는 데 필요한 모든 기능을 갖춘 OO) 프레임 워크 세트를 제공합니다.

C 인터프리터, CINT 로 사용하거나 하나를 사용할 수 있습니다 많은 다른 C 인터프리터 . IMHO는 거대하고 복잡하며 강력하며 항상 친절하지는 않지만 큰 만족감을 줄 수 있습니다.

만약 당신이 Confucio 를 인용하는 당신의 작은 목소리를 듣고 싶지 않다면 당신은 준비가되어 있습니다 바퀴에서 (버터) 파리를 깰 수 있습니다root를 사용할 수 있습니다. 이 경우 -l 스플래시 화면을 표시하지 않으려면 필수입니다 ...

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
Hastur

"JavaScript의 힘"을 읽을 수는 없지만 Perl을 제외한 다른 부분에 대한 답변을지지해야했습니다.

실제로 정수 산술이 충분한 간단한 경우에는 buildin $ ((...))을 사용하고 권장합니다. 그렇지 않으면, 거의 모든 경우에 에코 "..."| BC는 충분하다.

통계, 행렬 연산 및 기타 R와 같은 일부 산술 연산이 더 나은 도구입니다.

echo 25 + 5 | R --Vanilla

작은 데이터 세트와 그래픽 폐기 결과의 경우 oocalc는 멋진 유틸리티입니다.

4
user unknown

콘솔 계산에는 concalc을 사용합니다. (Sudo aptitude install concalc)

그런 다음 concalc를 입력하고 Enter 키를 누르십시오. 프롬프트를 제공하지는 않지만 계산 (공백 없음)을 입력하고 Enter 키를 누르면 다음 줄에 숫자 값이 표시됩니다.

3
killermist

SQLite :

echo 'select 1 + 1;' | sqlite3 

MySQL :

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

PostgreSQL :

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

제공된 run-expr 프로그램을 통해 GNU 다중 정밀도 산술 라이브러리 를 사용하십시오.

  • 다운로드 및 추출 (lzip 필요) : tar -xvf gmp-5.1.3.tar.lz
  • 최상위 디렉토리에서 ./configuremake (설치 필요 없음)
  • 데모/전문가에서 make run-expr
  • ~/bin 디렉토리에 ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr 기호 링크를 만들고 싶습니다.
  • 쉽게 사용할 수 있도록 별칭을 추가하십시오. 예를 들어 부동 소수점 평가를위한 alias calcf='run-expr -f'

산출:

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

run-expr.c 파일에서 :

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.

함수 클래스의 차이점과 자세한 내용은 manual 을 참조하십시오.

2
user44370

여기의 나머지 솔루션에는 모두 현저한 단점이 있습니다.

그래서 가장 간단하고 안정적인 방법으로이 작업을 수행 할 수있는 새로운 명령을 만들었습니다.

견본:

$ solve 1/5
0.2
$ solve 1.5+3.1
4.6
$ solve 1/1000000
1e-06
$ solve 7+2^3
15
$ solve "sqrt(8)"
2.82842712474619
$ solve 1/0
non solvable ????: 1/0