GMP(The GNU Multiple Precision Arithmetic Library)又叫GNU多精度算术库,是一个提供了很多操作高精度的大整数,浮点数的运算的算术库,几乎没有什么精度方面的限制,功能丰富。
要使用GMP首先从http://gmplib.org/下载源码包,解压缩后编译安装:
下面我们以求10000!为例说明如何使用gmp。
要使用gmp必须先包含gmp的头文件:
求10000!我们需要的数据类型是整数,当然需要的是多精度整数,定义一个多精度整数(multiple precision integer)变量可以用:
现在我们需要定义三个变量:
分别用来迭代1..10000之间的数字、保存结果、保存1这个数字以使得z_i自增。
可以用字符串来给多精度数字初始化为一个大数:
mpz_init_set_str的原型是:
int mpz_init_set_str (mpz_t rop, char *str, int base)
这三个参数分别是多精度整数变量,字符串,进制。
现在我们循环10000次并进行乘法和加法,乘法和加法的函数分别是mpz_mul,mpz_add,原型分别是:
void mpz_add (mpz_t rop, mpz t op1, mpz t op2)
效果为:rop = op1 + op2
void mpz_mul (mpz_t rop, mpz t op1, mpz t op2)
效果为:rop = op1 * op2
我们的程序可以写为:
然后我们按大整数的格式来输出结果,因为是mpz_t类型,不能用一般的printf,只能用gmp_printf:
最后我们释放这几个大整数所占的空间:
程序就完毕了。
运算结果非常大,显示了几页但是速度却非常快,几乎是一秒不到就做完了还包括了在控制台打印时间。
完整的程序如下: