按echo "20+5"
字面使用会产生文字“ 20+5
”。
25
在这种情况下,我可以使用什么命令来获取数字总和?
另外,仅使用bash进行浮点运算的最简单方法是什么?例如,echo $((3224/3807.0))
打印0
:(。
我正在使用基本命令外壳程序(“命令行”)本身或通过使用命令行中可用的语言来寻找答案。
按echo "20+5"
字面使用会产生文字“ 20+5
”。
25
在这种情况下,我可以使用什么命令来获取数字总和?
另外,仅使用bash进行浮点运算的最简单方法是什么?例如,echo $((3224/3807.0))
打印0
:(。
我正在使用基本命令外壳程序(“命令行”)本身或通过使用命令行中可用的语言来寻找答案。
Answers:
$ 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位),但我们可以扩展大多数shell来进行浮点数学运算:
$ 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
需要加载zmodload zsh/mathfunc
以获取类似的功能atan
)。
与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
shell家族中,akanga
是具有算术扩展的那个:
; echo $:25/3
8
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
约书亚的解决方案:(awk
无交互模式):
$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333
这更有趣,因为它通过反向抛光符号起作用。
$ echo 20 5 2 / + p | dc
22
$ echo 4 k 20 5 2 / + p | dc
22.5000
但是不实用,除非您经常使用反向抛光符号。
请注意,dc
早于bc
且bc
历史上已实现为包装器,dc
但dc
尚未由POSIX标准化
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
;无需输出函数):
$ 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 Shell:
$ 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
>
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平方打印
$ 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
whatis bc
-> An arbitrary precision calculator language
有趣!谢谢!
dc
,由于使用了反向抛光符号,因此更有趣。echo 20 5 + p | dc
但是不实用,除非您经常使用反向抛光符号。
## Command line calculator calc () { bc -l <<< "$@" }
math
正如我们所说的那样,他们正在开发新的内置函数(或现在所说的任何东西)。随时编辑。这不是我的答案,而是社区Wiki。
有很多计算方法。对于简单的表达式,您可以bash
自己使用:
echo $((20+5))
或expr
:
expr 20 + 5
对于复杂的情况,有一个很棒的工具bc
:
echo "20+5" | bc
Btw,bc甚至可以计算具有根,对数,cos,sin等的非常复杂的表达式。
expr
选择添加到了接受的答案中。只好挑选一个接受并集中。
expr 20+5
。您需要在数字和加号之间输入空格以使其起作用:expr 20 + 5
。那很重要
提到的解决方案适用于非常简单的计算,但容易出错。例子:
# 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
bc
的结果不是整数,而是四舍五入为scale
,其默认值为0。因此,bc <<< 'scale=4;9.0/2.0'
如果要小数部分。
scale
如果我bc
在几周内使用,我会建议添加吗?可能不是。并且即使有永久更改它的方法,如果您使用默认设置的系统,它也会咬住您。
scale
自从bc
几年前第一次见面以来。但是我总是忘记了其中的输出函数lua
是put
还是puts
。;)
bc -l
而不是简单bc
,然后再也不用担心scale
。
还没有人提到awk吗?
使用POSIX shell函数和awk数学功能,只需定义以下(一行)函数即可:
calc(){ awk "BEGIN { print $*}"; }
然后,只需执行喜欢的东西calc 1+1
或calc 5/2
注意:要使该功能始终可用,请将其添加到〜/ .bashrc(或相应的Shell的启动文件)中
当然,一个名为“ calc”的小脚本具有以下内容:
#!/bin/sh -
awk "BEGIN { print $* }"
也可以。
a=0; b=0.0; if echo "$a" "$b" | awk '{ exit ($1 == $2) ? 0 : 1 }'; then echo 'equals'; else echo 'not equals'; fi
您可以使用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
bc
当其stdin和stdout都进入终端时,GNU的实现在启动时会打印该标头/版权信息。您可以使用(特定于GNU的)-q
选项禁止显示。有关更多信息,请参见BC手册页。
ctrl-d
退出?
quit
c () { bc -l <<< "$@" }
将定义一个功能c
,方便快速使用。例如c 3/2
会给你1.50000000000000000000
。上面描述如何执行此操作的链接已失效。
您可以使用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
,我喜欢它表现得更好的默认方式
calc -e '2+4; 3+5; 3.4+5; 2^4
打印4条输出行,或者仅打印calc -e 33+(3^3)
.. +1我喜欢使用称为“ calc”的计算器的想法:)
-e
当只有一个表情......不需要选项整齐..!
我喜欢启动Python并将其用作交互式计算器(但同样,我是Python程序员)。
screen
运行Python时,我总是只有一个窗口。
既然没有人提到过它,尽管它并不是严格意义上的计算器(但所有这些通用脚本语言也不都是),但我想提一下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
$> ghc -e '20 + 5'
25
it :: Integer
同样ghci
,交互模式下的Glasgow-Haskell编译器(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
ghc
是Glasgow Haskell编译器的意思吗?
我使用了一个小的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')
不幸的是,我不记得我从哪里借来了大部分代码,因此我无法引用它。
print(eval(' '.join(sys.argv[1:])))
做同样的事情?
gnuplot-交互式绘图程序
按照上面的链接或在 gnuplot解释器中输入gnuplot
提示形式。Gnuplot是一个用于绘制数据的程序,但也可以用于计算。它提供的优势是您可以定义功能或使用内置功能。help
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系统提供了一组在一个非常有效的方式来处理和分析大量数据所需的所有功能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
bash
echo $(( 1+1 ))
fish
math 1+1
zsh*
echo $((1+1))
*:和ksh93,yash
bash
awk "BEGIN {print 10/3}"
(低精度)bash
echo "10/3"|bc -l
(高精准度)fish
math -s4 10/3
zsh*
echo $((10./3))
*:和ksh93,yash
当然,您可以将shell配置为使用awk并使用最少的类型,例如calc 10/3
(请参阅有关如何对bash 1和fish 2进行操作的说明)。
建议使用bash的awk的主要原因是,它几乎已经预安装在所有与Unix相似的Unix操作系统上,并且相对轻巧(更人性化),输出比bc -l
打印20十进制小得多,但它相对较轻但更人性化数字(尽管您当然可以调整awk以获得更多的十进制数字)。
将此bash函数添加到您的~/.bashrc
:
calc(){ awk "BEGIN { print $*}"; }
创建一个calc
fish函数(即名为的文本文件/home/ndemou/.config/fish/functions/calc.fish
):
function calc
awk "BEGIN{ print $argv }" ;
end
awk
将使用系统的double
浮点类型,那么将是为精确作为不做任意精度(注意,GAWK可以做任意精度)其它大部分工具。awk
使用OFMT
变量将数字转换为其字符串表示形式以进行输出(%.6g
默认情况下,您可能希望将其更改%.17g
为想要更高的精度)。
bc
。这不是在新版本中不再那里的东西喜欢math "scale=4; 10/3"
(就不管用了math -s4 10/3
,现在不是)
math -s4
似乎也支持旧版本)
SQLite:
echo 'select 1 + 1;' | sqlite3
MySQL的:
mysql -e 'select 1 + 1 from dual;'
PostgreSQL:
psql -c 'select 1 + 1 as sum;'
from dual
Oracle需要的,MySQL能够select
不带from
子句。2)PostgreSQL不需要别名。3);
只有SQLite才需要。4)MySQL和PostgreSQL仅在能够连接到数据库服务器时才能工作。5)MySQL和PostgreSQL将围绕结果绘制ASCII艺术表。仅获取值:mysql -BNe 'select 1+1'
和psql -tAc 'select 1+1
。
通过提供的程序使用GNU多精度算术库run-expr
:
tar -xvf gmp-5.1.3.tar.lz
./configure
并且make
(无需安装)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.
有关功能类差异和详细信息,请参见手册。
bc
,最好花点时间阅读-l
手册页中的选项。