2014-01-14 95 views
1

我想我已經遇到了一些類型的awk溢出,而我不知道怎麼去解決它,見下圖:awk中的整數溢出

BEGIN { 
    print 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 
    print  22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 
} 

這是輸出:

25852016738884978212864 
1124000727777607680000 

雖然第二個是正確的,第一個不是,23!等於25852016738884976640000.

有沒有辦法得到這個,也許有些變種?

精確我使用GAWK:使用

GNU Awk 4.0.1 
+0

'awk'做不要假裝提供任意的精確算術。您可以通過用浮點版本替換某些數字來避開它,但將'22'設置爲'22.0'實際上並未達到預期的效果。使用「無限精度」算法的工具; 'bc'就是這樣一個工具,Python是另一個工具。 –

+3

如果您的'awk'版本支持[Arbitrary Precision Arithmetic](http://www.gnu.org/software/gawk/manual/gawk.html#Arbitrary-Precision-Arithmetic),即使用'gmp',你可以提供'-M'選項來獲得想要的結果。 – devnull

+0

我不得不用mpfr的標誌重新編譯gawk,它允許我使用-M選項。謝謝! –

回答

2

BC

$ echo '23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1' |bc 

25852016738884976640000 

可以awk的結果導出到BC命令:

cat a.awk 

BEGIN { 
    for (i=23;i>1;i--) printf "%d * ",i ; printf 1 RS 
    for (i=22;i>1;i--) printf "%d * ",i ; printf 1 RS 
} 

awk -f a.awk|bc 

25852016738884976640000 
1124000727777607680000