如何处理 bash 中值大于 2^63 的整数
How to handle integers in bash with values larger than 2^63
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
我建议使用具有任意精度的 bc
。
Bash 在 263:
溢出
$ 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 处理它们:
$ bc <<< "$B > $A"
1
并且由于在 (( ))
中非零结果评估为真,零为假,我们可以使用
$ (( $(bc <<< "$B > $A") )) && echo true
true
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
我建议使用具有任意精度的 bc
。
Bash 在 263:
溢出$ 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 处理它们:
$ bc <<< "$B > $A"
1
并且由于在 (( ))
中非零结果评估为真,零为假,我们可以使用
$ (( $(bc <<< "$B > $A") )) && echo true
true