web-dev-qa-db-ja.com

bashまたは他の言語/フレームワークで整数と浮動小数点の計算を行う方法は?

_echo "20+5"_を使用すると、文字どおり「_20+5_」というテキストが生成されます。

数値の合計、この場合は_25_を取得するためにどのコマンドを使用できますか?

また、浮動小数点にbashを使用するだけの最も簡単な方法は何ですか?たとえば、echo $((3224/3807.0))は_0_ :(を出力します。

基本的なコマンドシェル( 'コマンドライン')自体を使用するか、コマンドラインから使用できる言語を使用して回答を探しています。

316
Michael Durrant

たくさんのオプションがあります!!!

概要

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

細部

シェル

integer演算に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
_

_ksh93_(直接)とzshここにライブラリmathfuncをロードするだけです:

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

zshは、atanのような関数を取得するために_zmodload zsh/mathfunc_をロードする必要があります)。


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(東部基準時 cアルキュレーター(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
_

ラッシュ の解決策、expr(インタラクティブモードなし):

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

ジョシュアの解決策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
_

ただし、逆ポーランド記法を頻繁に使用しない限り、実用的ではありません。

dcbcおよびbcよりも前にdcのラッパーとして実装されてきましたが、dcはPOSIXによって標準化されていません。


DQdims 's 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;出力関数は不要):

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

Ruby(インタラクティブモード:irb;出力関数は不要):

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

ガイル(インタラクティブモード: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
_

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

さまざまな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のオプションにより、「ascii art」イメージが停止します。

専門的な数学指向言語:

[〜#〜] r [〜#〜]プレーンモード-1000の正規乱数を生成し、標準偏差を取得して出力します

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

[〜#〜] r [〜#〜]littlerスクリプトを使用-piを2乗して印刷します

_$ 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
_
431
lgarzo

計算には多くの方法があります。単純な式の場合、bash自体を使用できます。

echo $((20+5))

またはexpr

expr 20 + 5

そして、複雑な場合のための素晴らしいツールbcがあります:

echo "20+5" | bc

ところで、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シェル関数とawk数学パワーを使用して、次の(1行)関数を定義します。

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

次に、calc 1+1またはcalc 5/2などを実行します。

注:関数を常に使用できるようにするには、関数を〜/ .bashrc(または対応するシェルの起動ファイル)に追加します

もちろん、次の内容の「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の両方が端末に送信されるときに、起動時にそのヘッダー/著作権情報を出力します。これは(GNU固有の)-qオプション。詳細については、 bcのマニュアルページ を参照してください。

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を提案する主な理由は、ほとんどのUnixライクなOSにプリインストールされており、20を出力するbc -lよりも正確ではないが人間にやさしい出力で、適度に軽量です(もちろんプロセスを開始するコストがあります)。 10進数(ただし、確かに awkを微調整して10進数を増やす )。


ノート

(1)bashでの簡略化された構文の使用方法

このbash関数を~/.bashrcに追加します。

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

(2)fishでの簡略化された構文の使用方法

calc fish関数(つまり、/home/ndemou/.config/fish/functions/calc.fishという名前のテキストファイル)を作成します。

function calc
    awk "BEGIN{ print $argv }" ;
end
6
ndemou
$> ghc -e '20 + 5'
25
it :: Integer

また、ghci、つまり Glasgow-Haskell Compiler インタラクティブモード(ghc --interactive、それは -e )、魅力的な「電卓」になります:

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

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-インタラクティブなプロットプログラム
上記のリンクに従うか、プロンプトからgnuplotと入力し、gnuplotインタープリター内でhelpと入力します。
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インタプリタ のいずれかを使用できます。私見、それは巨大で、複雑で、強力で、いつもフレンドリーではありませんが、大きな満足感を与えることもできます。

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を除いて、他の部分の答えは賛成しなければなりませんでした)。

実際には、整数演算で十分な単純なケースでは、ビルトイン$((...))を使用して推奨します。それ以外の場合、ほとんどすべての場合、「...」をエコーし​​ます。 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
  • 最上位ディレクトリの./configureおよびmake(インストールする必要はありません)
  • Demos/exprでは、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