减去bash中的大数字

时间:2019-01-17 15:52:44

标签: bash terminal

我想用两个大数做一个子

我的目的是

180533411136927648574464402032155147144719003095505008585-3369574570478873127315415525946742317481702644901195284480

我尝试

echo $((1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480))

我的结果是: 3160661815551241129

但这是不正确的。

我可以在控制台Chrome中执行类似的操作 而且我有

-1.5642404591095965e+

如何在bash中执行此操作? 我什至尝试了expr,但没有幸运

可以检查一个数字是否大于另一个数字

在外壳中

echo $((1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480))

结果:1​​

Chrome中的操作相同

1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480

结果:否

Chrome是正确的

4 个答案:

答案 0 :(得分:4)

ARITHMETIC EVALUATION手册的bash部分说明了为什么使用$((...))得到此结果:

  

以固定宽度的整数进行评估,不检查溢出

您也许可以使用expr(取决于编译时选项,请检查@Benjamin W的注释),但是您需要在运算符及其操作数之间留空格:

$ expr 1805334111369276485744644020321551471447190030955050085289 - 3369574570478873127315415525946742317481702644901195284480
-1564240459109596641570771505625190846034512613946145199191

正如@PesaThe所提到的,您也可以使用bc,它的主要功能之一是可以处理任意精度的算术:

bc <<< "1805334111369276485744644020321551471447190030955050085289 - 3369574570478873127315415525946742317481702644901195284480"
-1564240459109596641570771505625190846034512613946145199191

答案 1 :(得分:1)

您可以使用Perl

$ perl -le ' BEGIN { use Math::BigInt; my $x=Math::BigInt->new("1805334111369276485744644020321551471447190030955050085289"); my $y=Math::BigInt->new("3369574570478873127315415525946742317481702644901195284480"); print $x->bsub($y) } '
-1564240459109596641570771505625190846034512613946145199191
$ perl -le ' BEGIN { use Math::BigInt; my $x=Math::BigInt->new("1805334111369276485744644020321551471447190030955050085289"); my $y=Math::BigInt->new("3369574570478873127315415525946742317481702644901195284480"); printf("%g\n",$x->bsub($y)) } '
-1.56424e+57
$

如果要将回声输出传递给Perl,则

$ echo "1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480" | perl -ne ' BEGIN { use Math::BigInt } /(\d+)-(\d+)/; $x=Math::BigInt->new($1); $y=Math::BigInt->new($2); printf("%g\n",$x->bsub($y)) '
-1.56424e+57
$

就像@Pesa提到的,您也可以使用bc

$ bc <<< "1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480"
-1564240459109596641570771505625190846034512613946145199191
$

答案 2 :(得分:1)

如果您喜欢冒险,可以使用旧的dc(台式计算器,一个可爱的RPN计算器):

dc <<< "1805334111369276485744644020321551471447190030955050085289 3369574570478873127315415525946742317481702644901195284480 - p"

答案为:-1564240459109596641570771505625190846034512613946145199191

答案 3 :(得分:1)

Mac OSX awk也可以处理大数字:

awk 'BEGIN{print 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'

-1.56424045910959651912822682029e+57

或使用printf

awk 'BEGIN{printf "%.5e\n", 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'

-1.56424e+57

另一方面, GNU awk 需要切换-M以支持大数,因此请使用:

gawk -M 'BEGIN{print 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'