Written by razrlele
11:01 June 12, 2014
前天看见同学分享的一个微软面试题:求 y = sin(e^5120) 的值
然后就在网上搜了一下, 就找到了GMP这个玩意儿,
GNU多重精度运算库(英语:GNU Multiple Precision Arithmetic Library,简称GMP或gmpal)是一个开源的任意精度运算库,支持正负数的整数、有理数、浮点数。它没有任何任何精度限制,只受限于可用内存。GMP有很多函数,它们都有一个规则的接口。它是C语言写成的,但用为其他很多语言做包装,包括Ada,C++,C#,OCaml,Perl,PHP和python。 GMP主要运用于密码程序和搜索,和计算机代数系统。 GMP的目标是成为最快的大数运算库, GMP是GNU项目的一部分,它在GNU宽通用公共许可证下发表。 GMP在许多计算机辅助代数系统中用于整数运算,如Mathematica和Maple。 GMP需要使用GNU(GCC编译器套装)编译。
–维基百科
简而言之, 其实就是一个头文件, 直接看代码比较实在:
首先是安装, 可以去官网下载源码make install
, 在Ubuntu下直接:
1 |
sudo apt-get install libgmp3-dev |
即可安装GMP函数库。
接下来看一个指数函数计算的的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> #include <gmp.h> int main() { mpz_t result, base; //定义gmp整型变量 mpz_init(base); //gmp里面的变量赋值以前都要初始化,估计是分配内存空间 mpz_init(result); unsigned long int exponent; //定义长整型指数 printf("Please input a base:n"); gmp_scanf("%Zd", &base); //输入基数 printf("Please input a exponent:n"); //输入指数 scanf("%ld", &exponent); mpz_pow_ui(result, base, exponent); //调用gmp里面的指数函数 gmp_printf("%Zdn", result); //调用gmp里面的printf,因为输出的结果可能会比较大,所以printf不够 mpz_clear(base); //gmp变量在用完过后需要clear,大概就是释放空间 mpz_clear(result); return 0; } |
gcc编译:
1 |
gcc -o file file.c -lgmp // 编译的时候注意连接gmp |
遗憾的是gmp里面的指数函数形参只能为整形或者长整型, 这样一来就无法计算自然对数了, 所以说那个题目最终还是只能用数学方法求解。
参考: