2014-01-14 65 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