如何在bash中处理大于2 ^ 63的整数

时间:2018-08-16 19:55:25

标签: bash largenumber

似乎bash的最大有符号整数值为9223372036854775807(2 ^ 63)-1。 bash是否有办法处理比此更大的值?我需要处理最大为10000000000000000000000000001的数字,但是我不确定如何在bash中完成此操作。

A=10000000000000000000000000000
echo $A
10000000000000000000000000000
let A+=1
echo $A
4477988020393345025

编辑 感谢本杰明·W。的评论。基于此,我正在尝试以下策略。是否有任何与此有关的感知问题?意思是,除了调用bc会导致性能下降外,使用bc增加我的变量还会带来一些并发症吗?

A=10000000000000000000000000000
echo $A
10000000000000000000000000000
A=$(bc <<< "$A+1")
echo $A
10000000000000000000000000001

此外,我已经测试了一些bash操作(大于,小于等),并且看起来像预期的那样。例如:

A=10000000000000000000000000000

echo $A
10000000000000000000000000000

[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"

A=$(bc <<< "$A+1")

echo $A
10000000000000000000000000001

[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"
A is bigger than 10000000000000000000000000000

1 个答案:

答案 0 :(得分:3)

我建议以任意精度使用bc

Bash在2 63 处溢出:

$ A=$(( 2**63 - 1 ))
$ echo $A
9223372036854775807
$ echo $(( A+1 ))
-9223372036854775808

bc可以处理:

$ bc <<< "$A+1"
9223372036854775808

但是,从现在开始,这些数字必须由bc处理。使用[[ ]],它们似乎没有溢出,但是比较无法正常工作:

$ B=$(bc <<< "$A+1")
$ echo $B
9223372036854775808
$ set -vx
$ [[ $B -gt -$A ]] && echo true
[[ $B -gt -$A ]] && echo true
+ [[ 9223372036854775808 -gt -9223372036854775807 ]]

在算术上下文(( ))中,它们溢出:

$ echo $(( B ))
-9223372036854775808

因此比较也不起作用:

$ (( B > A )) && echo true || echo false
false

使用公元前处理它们:

$ bc <<< "$B > $A"
1

并且由于在(( ))中非零结果的值为true,零为false,我们可以使用

$ (( $(bc <<< "$B > $A") )) && echo true
true