GMP手册笔记

本文详细介绍了GMP库的基础概念,包括头文件、数据类型和命名,特别是mpf_t和mpq_t的区别。文章还深入探讨了整数函数,包括初始化、赋值、转换函数和数值计算函数等,强调了正确使用GMP变量的重要性,并提醒避免使用未说明的函数以保持与未来版本的兼容性。
摘要由CSDN通过智能技术生成

GMP 6.1.2

  • last update 2022.08.21
    使用GMP时,不要使用本文档未说明的函数、宏、数据类型,否则不保证你的程序不与未来版本的GMP兼容。

基础概念

头文件和库

使用GMP所需要的一切声明都汇集到了头文件gmp.h里,此头文件同时适用于C和C++。GMP中有些函数接受FILE*参数,只有当同时包含了stdio.h时,这些函数才是可用的。

#include <stdio.h>
#include <gmp.h>

类似的还有:stdarg.h对应可变参数函数(如gmp_vprintf()),obstack.h对应使用struct obstack参数的函数(gmp_obstack_prif())。
编译的时候要链接gmpgcc prog.c -lgmp。C++函数单独存放在另外的库gmpxxg++ prog.cpp -lgmpxx -lgmp

数据类型和命名

整数(integer)是指高精度整数(multiple precision integer),数据类型mpz_t
有理数(rational number)是指高精度分数(multiple precision fraction),类型mpq_t
浮点数(Floating point number,Float)由一个任意精度的尾数(mantissa)和一个极限精度的指数(limited precision exponent)构成。

// 声明 mpz_t 类型的变量
mpz_t num;
mpz_t vec[20];
struct foo{
   mpz_t x,y;};
// 分数和浮点数
mpq_t quotient;
mpf_t fp;

浮点数函数用mp_exp_t类型接受和返回指数,此类型一般是long,有些机器上是int(为了效率)。
高精度数中等于一个机器字长的部分称为一个limb(汉语意思为,四肢的肢)。类型为mp_limb_t。通常一个limb是32位或64位。
一个高精度数包含的limb的数目,用mp_size_t类型保存,此类型一般般是long,某些系统上是int,将来可能是long long
一个高精度数有的位数用mp_bitcnt_t类型保存,当前此类型总是unsigned long,将来某些系统上可能会变成unsigned long long
随机状态用类型gmp_randstate_t表示。(Random state means an algorithm selection and current state data.)。
mp_bitcnt_t用于位(bit)的计数以及表示范围;size_t用于给字节和字符计数。

mpf_t 和 mpq_t 的区别?

一方面1/3可以用分数精确表示,但保存为浮点数会有误差。另一方面,实数域中,无理数无法表示为分数。

函数

函数分为六大类

  1. 整数函数:进行有符号整数运算,对应mpz_t类型,函数名一律以mpz_为前缀;共有约150个。
  2. 有理数函数:给分数做运算,对应mpq_t类型,函数名以mpq_为前缀,只有50个左有,但是有理数类型中的分子和分母可以分使用整数类型运算。
  3. 浮点数函数:进行浮点数运算,对应mpf_t,以mpf_为前缀,共有70个左有。
  4. 底层函数:在自然数上运算,此类函数是供上述三类函数调用的,共有60个左有,特点是速度更快、特别难用;在特别注重效率的极其关键的代码中可以直接调用这些函数。
  5. 杂项函数:包括自定义内存分配函数和随机数生成函数两类。

关于变量的约定

GMP函数一般把输出参数放在输入参数之前,此约定是受赋值运算符的启发;兼容与BSD MP 的函数是例外:输出参数放在最后。
在一次函数调用中可以把同一个变量同时用作输入输出参数。gmz_mul(x,x,x);此调用计算整数x的平方然后把计算结果再存入x中。
使用GMP变量之前,需要先初始化,使用完毕要释放变量。初始化和释放是通过专门的函数调用完成的。一个变量只需要初始化一次,如果非要多次初始化,在每次初始化操作之间释放变量。初始化后的变量可以进行任意次赋值。
一般在函数的开头初始化变量,函数末尾释放变量;为了效率,应避免过多的变量初始化和释放操作。

void foo (void)
{
   
mpz_t n;
int i;
mpz_init (n);
for (i = 1; i < 100; i++)
{
   
mpz_mul (n, ...);
mpz_fdiv_q (n, ...);
...
}
mpz_clear (n);
}

关于参数的约定

把变量作为函数参数传递时,实际上传递的是指针。
如果自己编写的函数要返回结果,应该仿照GMP的库函数,使用输出参数;如果直接使用return语句,返回的仅仅是个指针。mpz_t实际上是长度为1的结构体数组,结构体内部的成员变量仅供库内部使用,如果在程序中访问了结构体成员,在新版GMP库中很可能不兼容。

内存分配

GMP自己会管理自己申请的内存。mpz_tmpq_t在类型的变量需要时会申请更大的内存,但从不会减小内存,为了效率;mpf_t类型的变量使用固定的内存,内存大小根据初始化时的精度设置确定。如果程序要释放内存,可以清楚不再使用的GMP变量,或者mpz_realloc2函数释放内存。
GMP默认使用malloc系列函数进行内存分配,但这是可设置的。

重入

GMP是可重入的且是线程安全的,除了如下例外情况:

  1. 编译时使用了--enable-alloca=malloc-notreentrant选项
  2. 函数mpf_set_default_prec()mpf_init()使用全局变量保存精度
  3. 函数mpz_random()以及其它旧随机数生成函数使用全局变量保存随机状态,故是不可重入的。新的随机函数可用,这些函数使用gmp_randstate_t参数
  4. gmp_randinit()(已过时)在全局变量中返回错误码,所以不可重入;使用新函数gmp_randinit_default()gmp_randinit_lc_2exp()
  5. mp_set_memory_funcitons()使用全局变量保存内存分配函数
  6. 如果mp_set_memory_functions()设置的内存分配函数是不可重入的,那么GMP也将是不可重入的。默认的malloc()函数是不可冲入的
  7. 如果标准IO函数不可重入,则GMP的IO函数也不可重入
  8. 多个线程同时读一个GMP变量是安全的;但多线程一个读一个写、或多个同时写入都是不安全的;多线程使用同一个gmp_randstate_t变量生成随机数也是不安全的

宏和常量

const int mp_bits_per_limb 一个limb的位数

const char * const gmp_version x.y.z 格式的GMP版本;例如“6.2.1”
GMP编译时用的编译器__GMP_CC
GMP编译时的选项__GMP_CFLAGS

5. 整数函数

初始化

void mpz_init(mpz_t x) 初始化x并设其初值为0
void mpz_inits(mpz_t x, ...) 初始化参数列表中的变量,初值设为0. 最后一个参数用NULL,表示结束。
void mpz_clear(mpz_t x), void mpz_clears(mpz_t x, ...) 释放变量
void mpz_realloc2(mpz_t x, mp_bitcnt_t n),把x的空间设为n位,如果新的空间合适,x的值保持不变,如果存不下,x的值设为零。一般不需要调用此函数。除非1. 要释放多余的空间;2. 一次性分配足够的空间以避免后续的计算多次逐步分配空间影响性能。

Change the space allocated for x to n bits. The value in x is preserved if it fits, or is set to 0 if not.

赋值

void mpz_set(mpz_t x, const mpz_t op)
void mpz_set_q(mpz_t x, const 
  • 20
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
GMP(Good Manufacturing Practice,良好制造规范)是一种关于药品的生产标准,用于确保药品在制造过程质量的稳定性和一致性。GMP知识手册PDF为GMP相关知识的电子版手册GMP知识手册PDF是一个提供药品制造方面规范和准则的电子资源。它包含了一系列关于药品生产的规定和要求,如设备和设施的要求、人员资质和培训、物料采购和控制、文件记录管理、生产过程控制、质量控制、品质保证等。 GMP知识手册PDF可以帮助制药行业提高药品生产的质量,并确保符合相关监管机构的要求。手册包含了对于药品生产各个环节的详细要求和操作规程,供制药企业和生产人员参考和遵守。通过阅读GMP知识手册PDF,制药企业可以了解并建立符合GMP标准的生产流程和品质保证体系。 这份电子手册的优势在于它的可移植性和易于传播。通过将GMP知识手册制作成PDF格式,用户可以方便地将其下载到各种电子设备,如电脑、平板电脑和手机。用户可以在任何时间和地点,根据自己的需求进行查阅和学习,提高自己对GMP规范的理解和应用。 总之,GMP知识手册PDF是一份重要的电子资源,对于制药行业来说非常有价值。它为药品生产提供了一系列的准则和规范,帮助制药企业提高产品质量和符合监管要求。同时,它的可移植性和易于传播的特点也使其成为制药从业者学习和应用GMP知识的便捷工具。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值