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

使用 echo "20+5" 实际上会生成消息“20+5”。

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

此外,简单地使用浮点数庆祝的最简单方法是什么? 例如,echo $((3224/3807.0)) 打印 0: (.

我正在使用基本命令外壳('命令行')本身或使用命令行提供的语言来寻求响应。

391
2022-06-07 14:37:02
资源 分享
答案: 13

我使用一个小的 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')

不幸的是,我不记得我从哪里获得了很多代码,所以我不能提及它。

6
2022-06-07 16:12:21
资源

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

echo $((20+5))

expr

expr 20 + 5

对于复杂的情况,有很棒的设备 bc

echo "20+5" | bc

顺便说一句,bc 甚至可以用根、对数、cos、越界等来确定非常复杂的表达式。

44
2022-06-07 15:12:27
资源

您可以使用 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,我非常喜欢它作为默认值的方法要好得多

20
2022-06-07 15:12:10
资源

对于控制台估计,我使用 concalc。 (sudo aptitude install concalc)

之后,只需输入 concalc 并按回车键。 它不会提供准时,但只需键入您的计算(无空格)并按下回车键,然后在下一行,它会为您提供数值。

6
2022-06-07 15:11:58
资源

我喜欢启动 Python 并将其用作交互式计算器(但话又说回来,我是一名 Python 设计师)。

13
2022-06-07 15:11:51
资源

我不敢相信阅读“JavaScript 的力量”(但我需要支持其他部分的响应,当然 perl 除外。

实际上,对于整数算术足够的基本实例,我使用内置 $ (( )) 以及推荐它。 否则,几乎在所有情况下都类似于“ "|bc 就足够了。

对于一些算术运算,如统计、矩阵过程甚至更多,R 是更好的设备:

echo 25 + 5 | R --vanilla

以及对于小型数据集和视觉丢弃结果,oocalc 是一种奇妙的能量。

6
2022-06-07 15:11:20
资源
$> 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
9
2022-06-07 15:08:25
资源

指出的选项对于真正的基本估计很好,但非常容易出错。 实例:

# 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
30
2022-06-07 15:07:41
资源

您可以使用 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 的 GNU 执行会在其标准输入和标准输出最有可能无法治愈时在启动时打印该标题/版权信息。 您可以使用(GNU - 某些)-q 替代方案来减少它。 要了解更多信息,请参阅 公元前手册页

20
2022-06-07 15:03:11
资源

有很多选择!!!

概括

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

POSIX 工具箱

bc (请参阅下面列出的交互模式),手册在这里

助记符:best calculator(尽管 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

但除非您大量使用反向光泽符号,否则它并不实用。

请注意,dcbc 之前,并且 bc 传统上被实现为 dc 的包装器,但 dc 没有被 POSIX 标准化


DQdims 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 (交互模式: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

S-朗 (交互模式: 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 艺术”照片!

专门面向数学的语言:

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

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

R 使用更小脚本 - 允许打印 pi 结算

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

巴黎/全科医生 ,一个广泛的计算机代数系统,用于数字概念、直接代数和其他一些东西

$ 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>
547
2022-06-07 14:59:41
资源

由于没有人实际讨论过它,而且虽然它不是纯粹的计算器(但也不是所有这些通用的函数脚本语言),我当然想说明 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
12
2022-06-07 14:53:07
资源

SQLite

echo 'select 1 + 1;' | sqlite3 

MySQL

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

PostgreSQL

psql -c 'select 1 + 1 as sum;'
3
2022-06-07 14:50:14
资源

还没有人讨论过awk?

利用 POSIX shell 特性和 awk 数学能力,只需指定这个(一行)函数:

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

然后只需执行 calc 1+1calc 5/2 之类的东西

注意:要使该功能始终可用,请将其添加到 ~/. bashrc (或等效的 shell 是启动文件)

培训课程,一个名为“calc”的小脚本,包含以下组件:

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

可能还会起作用。

31
2022-06-07 14:44:07
资源