为gawk
你需要指定要使用的BIGNUM包(如果gawk
与链接到该包编译):
$ gawk -M 'BEGIN{print 1455594303469326836 - 1455594303468741117}'
585719
(您也可以为相同的功能,gawk -M
做gawk --bignum 'prog'
)
如果没有-M
开关,您可以通过将字符串添加0
将输入转换为整数来查看溢出。注意第2栏是不一样的,第一:
$ echo "1455594303469326836 1455594303468741117" | awk '{print $1 " => " $1+0,ORS $2 " => " $2+0}'
1455594303469326836 => 1455594303469326848
1455594303468741117 => 1455594303468741120
VS
$ echo "1455594303469326836 1455594303468741117" | awk -M '{print $1 " => " $1+0,ORS $2 " => " $2+0}'
1455594303469326836 => 1455594303469326836
1455594303468741117 => 1455594303468741117
由于IEEE 754双打具有精度53位的尾数(可用于精确的整数表示到那个尺寸)便开始解除与尺寸大于53个比特的整数精确表示能力:
$ awk 'BEGIN{print 2**53, 2**53+1}'
9007199254740992 9007199254740992
^ ^ not +1 in least significant digit
$ awk -M 'BEGIN{print 2**53, 2**53+1}'
9007199254740992 9007199254740993
^ ^ fixed...
你的输入需要61位来表示准确(或62个比特用符号位),所以你失去了表示输入的最低有效位数的能力。
选项
如果没有gawk
与BIGNUM选项,则可以使用perl
与BIGNUM:
$ perl -Mbignum -E 'say 1455594303469326836 - 1455594303468741117'
585719
蟒蛇:
$ python -c 'print 1455594303469326836 - 1455594303468741117'
585719
bc:
$ echo "1455594303469326836 - 1455594303468741117" | bc
585719
红宝石:
$ ruby -e "puts 1455594303469326836 - 1455594303468741117"
585719
但基本POSIX awk中 - 没有布埃诺为arbitrarily precision integer或非IEEE 754浮点运算。所有的POSIX awk算法(或没有bignum的gawk)都是用IEEE双精度完成的,这个精度会随着您输入的大小而溢出。
585719是正确答案。 awk是错的,python是对的。 –
像@ juanpa.arrivillaga说的是正确的操作:S – Tzomas
有关使用大数字的更多信息:http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –