似乎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
答案 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