爲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 –