我想用两个大数做一个子
我的目的是
180533411136927648574464402032155147144719003095505008585-3369574570478873127315415525946742317481702644901195284480
我尝试
echo $((1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480))
我的结果是: 3160661815551241129
但这是不正确的。
我可以在控制台Chrome中执行类似的操作 而且我有
-1.5642404591095965e+
如何在bash中执行此操作?
我什至尝试了expr
,但没有幸运
可以检查一个数字是否大于另一个数字
在外壳中
echo $((1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480))
结果:1
Chrome中的操作相同
1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480
结果:否
Chrome是正确的
答案 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}'