如何在 bash 或其他语言/框架中进行整数和浮点计算?

如何在 bash 或其他语言/框架中进行整数和浮点计算?

按字面意思使用echo "20+5"会产生文本“ 20+5”。

25在这种情况下,我可以使用什么命令来获取数字总和?

另外,仅使用 bash 进行浮点运算最简单的方法是什么?例如,echo $((3224/3807.0))打印0:(。

我正在使用基本命令 shell(“命令行”)本身或通过使用命令行中可用的语言来寻找答案。

答案1

有很多选择!!!

概括

$ printf %.10f\\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ echo "$((20.0/7))"                       # (ksh93/zsh/yash, some 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
$ gs -q  <<< "5 2 div 20 add  ="

细节

贝壳

您可以使用 POSIX 算术扩展整数算术echo "$((...))":

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

相当便携(ash dash yash bash ksh93 lksh zsh):
使用 printf 打印浮点数的能力,我们可以扩展大多数 shell 来进行浮点数学计算,尽管范围有限(不超过 10 位数字):

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

ksh93,yashzsh在这里支持浮动:

$ 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

rcshell 家族中,akanga是具有算术扩展的:

; echo $:25/3
8

POSIX 工具箱

bc(交互模式见下文),手册在这里

助记符:bestc计算器(尽管b实际上是基本的)。

$ 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

其他或多或少的便携式工具

阿尔切格的解决方案,dc(交互模式:dc):

这更有趣,因为它通过逆波兰表示法工作。

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

但除非你经常使用逆波兰表示法,否则不太实用。

请注意,它dc早于bc并且bc历史上已作为包装器实现dc,但dc并未由 POSIX 标准化


DQ尺寸calc(必需的sudo apt-get install apcalc)

$ calc 2 + 4
6

通用语言解释器:

工作的人的解决方案,node(交互模式:node;不需要输出功能):

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

珀尔(交互模式: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)"

马可的解决方案,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 -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5

俚语(交互模式:slsh;不需要输出函数,只是一个;终止符):

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

(交互模式: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”图像!

专门的数学语言:

在普通模式下 - 让我们生成 1000 个正态随机数并获取标准差并打印它

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

使用较小的脚本 - 让我们打印 pi 的平方

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

帕里/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
>> 1.2 / 7
ans =  0.17143
>> sqrt(-1)
ans =  0 + 1i

朱莉娅,用于科学和数值计算的高性能语言和解释器。

非交互式选项:

$ julia -E '2.5+3.7'
6.2

幽灵脚本 GhostScript 是一个 PostScript 解释器,即使在非常旧的发行版中也很常见。
PostScript 文档查看支持的数学命令的列表。

交互示例:

$ GS_DEVICE=display gs
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>5 2 div 20 add  =
22.5
GS>

答案2

计算方法有很多种。对于简单的表达式,您可以使用bash自身:

echo $((20+5))

或者expr

expr 20 + 5

对于复杂的情况,有一个很棒的工具bc

echo "20+5" | bc

顺便说一句,bc 甚至可以计算非常复杂的表达式,包括根、对数、cos、sin 等。

答案3

还没人提到 awk 吗?

使用 POSIX shell 函数和 awk 数学功能,只需定义这个(一行)函数:

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

然后只需执行类似calc 1+1或的事情calc 5/2

注意:要使该函数始终可用,请将其添加到 ~/.bashrc (或相应 shell 的启动文件)

当然,还有一个名为“calc”的小脚本,其中包含以下内容:

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

也可以工作。

答案4

您可以使用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,我只是更喜欢它默认的行为方式

相关内容