数系统目前可以处理以下五种类型的数.docx
- 文档编号:23265711
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:35
- 大小:27.12KB
数系统目前可以处理以下五种类型的数.docx
《数系统目前可以处理以下五种类型的数.docx》由会员分享,可在线阅读,更多相关《数系统目前可以处理以下五种类型的数.docx(35页珍藏版)》请在冰豆网上搜索。
数系统目前可以处理以下五种类型的数
数系统编程说明书
版权所有
“数学机械化与自动推理平台”软件组
2003年5月
目录
1、数系统简述
2、各种数类所共有的操作
2.1、数的构造
2.2、数的基本操作
2.3、数的基本算术运算
2.4、数的比较
2.5、数的输入输出
2.6、其它数学运算
3、针对每一种具体数类的特定操作
3.1、有关大整数的操作
3.2、有关分数的操作
3.3、有关浮点数的操作
3.4、有关双精度浮点数的操作
3.5、有关复数的操作
4、常用的类型定义,常数定义和宏函数
5、编程时的一些注意事项
5.1、关于数的混合运算
5.2、关于浮点数(TFloatNum)的精度设置
***************************************************
1、数系统简述
数系统中包含以下五种子数类和一种基数类:
TBigInt(多精度整数类<大整数类>):
有关文件:
num_integer.h,num_integer.cpp,num_bigint.cpp。
数据结构:
TBigInt:
:
B*num;指向大整数基本内部表示的指针。
TFraction(分数类):
有关文件:
num_fraction.h,num_fraction.cpp。
数据结构:
TBigInt*nu;TBigInt型指针,表示分数的分子。
TBigInt*de;TBigInt型指针,表示分数的分母。
TFloatNum(浮点数类):
有关文件:
num_float.h,num_float.cpp。
数据结构:
TBigInt*mant;TBigInt型指针,表示浮点数的有效数字部分。
shortexp;整型变量,表示浮点数的指数部分。
注:
该浮点数的值可以表示为:
mant×10exp。
TDouble(双精度浮点数类):
有关文件:
num_double.h,num_double.cpp。
数据结构:
doublednum;double型变量,即TDouble类实际上就是对C/C++语言中的double类型的封装。
TComplex(复数类):
有关文件:
num_complex.h,num_complex.cpp。
数据结构:
TNumber*real;TNumber型指针,表示复数的实部,它不能再是TComplex类型。
TNumber*imag;TNumber型指针,表示复数的虚部,它不能再是TComplex类型。
TNumber(基数类):
上述五种子数类的基类,通过提取各种子数类的公共特性得到,在该类中实现各种子数类所共有的操作。
有关文件:
num_number.h,num_number.cpp。
数据结构:
TNumber*ptr;TNumber型指针,指向该数本身。
2、各种数类所共有的操作
这部分所列的操作基本上是在每一种子数类中都提供的操作,在基数类TNumber中一部分操作通过类型判断和类型转化之后
调用相应子数类中的运算来实现,而另一部分操作则利用虚函数的机制实现,在每个子数类中提供该虚函数的覆盖版本。
为避免重复,以下操作只列出其在TNumber类中的原型。
2.1、数的构造
TNumber();
基数的缺省构造函数
TNumber(char*str);
把字符串str构造成相应的数类:
若str中包含字符‘I’,则构造为复数TComplex;
若str中包含字符‘D’,则构造为双精度浮点数TDouble;
若str中包含字符‘.’,则构造为浮点数TFloatNum;
若str中包含字符‘/’,则构造为分数TFraction;
若不是以上四种情况,则构造为整数TBigInt。
TNumber(constTNumber&n);
基数的复制构造函数:
通过先进行类型判断,再调用相应的子数类的复制构造函数实现。
不构造新的内存,只修改引用计数。
类型转化构造函数:
TNumber(int);
TNumber(short);
TNumber(unsignedlong);
TNumber(double);
TNumber(TBigInt&);
TNumber(TFloatNum&);
TNumber(TFraction&);
TNumber(TDouble&);
TNumber(TComplex&);
2.2、数的基本操作
数的复制:
virtualTAtom*Copy();
数的复制
不构造新的内存,只修改引用计数。
赋值运算符:
TNumber&operator=(constTNumber&n);
数的赋值操作
不构造新的内存,只修改引用计数。
调用方法:
TNumbern,n1;
n=n1;
相反数运算符:
TNumberoperator-();
返回该数的相反数
符号和绝对值函数:
friendintsign(constTNumbern);
数的符号:
n=0时返回0;n>0时返回1;n<0时返回–1。
注:
n的类型不能是TComplex(复数)
friendTNumberabs(constTNumber&n);
数的绝对值
注:
n的类型是TComplex(复数)时,该函数即求复数n的模。
示例:
abs(-10)=10
abs(2+3I)=3
abs(2.0+3.0I)=3.605551275463989293119221267470495946251296573845246
abs(2.0D+3.0DI)=3.60555
abs(2/3+(3/5)*I)=13/15
取整:
virtualTBigIntCeil();
返回不小于该数的最小的整数,当该数为大整数类型时返回其本身。
注:
该数的类型不能是TComplex(复数)
示例:
n1:
=3.5;
n1->Ceil()=4
n2:
=-3.5;
n2->Ceil()=-3
n3:
=13241234/3241;
n3->Ceil()=4086
virtualTBigIntFloor();
返回不大于该数的最大的整数,当该数为大整数类型时返回其本身。
注:
该数的类型不能是TComplex(复数)
示例:
n1:
=3.5;
n1->Floor()=3
n2:
=-3.5;
n2->Floor()=-4
n3:
=13241234/3241;
n3->Floor()=4085
2.3、数的基本算术运算
四则运算符:
virtualTNumberoperator+(constTNumber&n);
virtualTNumberoperator-(constTNumber&n);
virtualTNumberoperator*(constTNumber&n);
virtualTNumberoperator/(constTNumber&n);
virtualTNumberoperator%(constTNumber&n);
virtualTNumberoperator+=(constTNumber&n);
virtualTNumberoperator-=(constTNumber&n);
virtualTNumberoperator*=(constTNumber&n);
virtualTNumberoperator/=(constTNumber&n);
virtualTNumberoperator%=(constTNumber&n);
TNumberoperator++(int);
TNumberoperator++();
TNumberoperator--();
TNumberoperator--(int);
2.4、数的比较
比较运算符:
friendbooloperator==(constTNumber&,constTNumber&);
friendbooloperator!
=(constTNumber&,constTNumber&);
friendbooloperator<(constTNumber&,constTNumber&);
friendbooloperator<=(constTNumber&,constTNumber&);
friendbooloperator>(constTNumber&,constTNumber&);
friendbooloperator>=(constTNumber&,constTNumber&);
比较函数:
friendintcomp(constTNumber&n1,constTNumber&n2);
比较两个数的大小:
fn1==fn2时,返回0;fn1>fn2时,返回1;fn1 最大值和最小值: friendconstTNumber&bmax(constTNumber&n1,constTNumber&n2); 取两个数n1和n2中的最大值 friendconstTNumber&bmin(constTNumber&n1,constTNumber&n2); 取两个数n1和n2中的最小值 2.5、数的输入输出 输入输出流: friendistream&operator>>(istream&in,TNumber&num); friendouttype&operator<<(outtype&out,constTNumber&num); 显示函数: virtualvoiddisplay(outtype&out=wout)const; 2.6、其它数学运算 平方根: friendTNumbersqrt(constTNumber&n); 返回数n的平方根,返回值的具体类型与输入值n的类型保持一致。 特别地,当n是大整数类型时,返回其平方根的整数部分。 注: 目前n不能是复数类型TComplex 示例: sqrt(341234123.34123412)=18472.523469*********0474597320 sqrt(19469237469234124)=139532209 sqrt(343.34D)=18.5294 sqrt(19461412341/1234123412)=69752/17565 乘幂: 分别提供指数n为以下不同类型的重载运算符: TNumberoperator^(TNumber&n); TNumberoperator^(unsignedn); TNumberoperator^(unsignedshortn); TNumberoperator^(intn); 3、对每一种具体数类的特定操作 3.1、有关大整数的操作 大整数的构造: TBigInt(); 缺省构造函数: 构造大整数0 TBigInt(constcharstr[]); 把字符串str构造成大整数 TBigInt(constTBigInt&bn); 大整数的复制构造函数: 不构造新的内存,只修改引用计数,即新构造的大整数与原整数共享数据。 类型转化构造函数(把各种普通类型的整数转化为大整数): TBigInt(constshortinum); TBigInt(constunsignedshortinum); TBigInt(constintinum); TBigInt(constunsignedinum); TBigInt(constunsignedlonginum); 获取大整数内部表示的某些信息: unsignedshortGetShort(unsignedn); 返回大整数内部表示数组的第n个单元里的值,由于每个单元占两个字节,这个值应该在0到65535之间。 索引值n从0开始。 intGetInt() 返回大整数第0个单元里的值,包括符号,因此这个值应该在-65535到65535之间。 该函数通常用于把数值在-65535到65535之间的大整数类型TBigInt转化为普通整数类型int。 unsignedLen()const; 返回大整数内部表示数组的单元数 不包括符号,不包括高位的零单元。 示例: bn: =1234567890123456789; bn->Len()=4 unsignedlength()const; 返回大整数的十进制的位数 示例: bn: =1234567890123456789; bn->length()=19 unsignedblength()const; 返回大整数的二进制的位数 示例: bn: =1234567890123456789; bn->blength()=61 voidGetHighUnit(int*res)const; 取得大整数内部表示数组的单元数(不包括符号,不包括高位的零单元),以及最高位单元里的值(非零),并把结果放入整数数组res中。 调用方法: TBigIntbn; inta[2]; bn.GetHighUnit(a); 注: a[0]: 大整数的单元数,a[1]: 最高位单元里的值 大整数的复制: TBigIntClone()const; 大整数的复制,不构造新的内存,只修改引用计数。 调用方法: TBigIntbn1,bn2; bn2=bn1.Clone();(等价于: bn2=TBigInt(bn1)) 特殊大整数判断: booliszero()const; 判断该大整数是否为0,是则返回true,否则返回false。 boolisone()const; 判断该大整数是否为1,是则返回true,否则返回false。 算术运算: 加/减1: friendvoidBnAdd1(TBigInt&bn); 把大整数bn本身修改为bn1+1 friendvoidBnSub1(TBigInt&bn); 把大整数bn本身修改为bn1-1 注: 大整数加/减1的操作比较常用,为提高运算效率特别实现了这两个函数。 在编程时应尽量用BnAdd1(bn);代替bn=bn+1;BnSub1(bn);代替bn=bn-1; 乘幂: 分别提供指数n为以下不同类型的重载运算符: friendTBigIntoperator^(constTBigInt&bn,constTBigInt&n); friendTBigIntoperator^(constTBigInt&bn,unsignedn); friendTBigIntoperator^(constTBigInt&bn,unsignedshortn); friendTBigIntoperator^(constTBigInt&bn,intn); 移位运算: friendTBigIntoperator<<(constTBigInt&bn,intn); 返回大整数bn左移n位以后的值,相当于计算bn*(2^n)。 friendTBigIntoperator>>(constTBigInt&bn,intn); 返回大整数bn右移n位以后的值,相当于计算bn/(2^n)。 friendTBigIntLeftShift1(constTBigInt&n); 返回1左移n位以后的值,相当于计算2^n。 中国剩余定理: (外部函数) TBigIntChineseRemainder(TList*m,TList*x); 算法1: 当一组模固定时,通常采用这种算法。 给定一组两两互素的正整数(模): m1,…,mk和一组整数: x1,…,xk,求一个整数x,满足: x=xn(modmn),1<=n<=k,且0<=x<=m1*...*mk。 注: 该函数中一组模和一组整数都以链表的形式输入。 示例: m1: =[3,5,7]; x1: =[1,2,4]; chrem(m1,x1)=67 m2: =[3,5,8,11]; x2: =[1,0,2,3]; chrem(m2,x2)=850 TBigIntChineseRemainder(intk,TBigInt**m,TBigInt**x); 算法1: 当一组模固定时,通常采用这种算法。 给定一组两两互素的正整数(模): m1,…,mk和一组整数: x1,…,xk,求一个整数x,满足: x=xn(modmn),1<=n<=k,且0<=x<=m1*...*mk。 注: 1.该函数中一组模和一组整数都以整数数组的形式输入。 2.该函数与上述函数功能相同,只是接口方式不同。 TBigIntChineseRemainderInductive(intk,TBigInt**m,TBigInt**x); 算法2: 递归算法。 给定一组两两互素的正整数(模): m1,…,mk和一组整数x1,…,xk: ,求一个整数x,满足: x=xn(modmn),1<=n<=k,且0<=x<=m1*...*mk。 注: 该函数中一组模和一组整数都以整数数组的形式输入。 最大公因子与最小公倍数: (外部函数) TBigIntigcd(constTBigInt&bn1,constTBigInt&bn2); Euclidean方法: 返回两个大整数bn1和bn2的最大公因子 示例: igcd(12,6)=6 igcd(12,7)=1 igcd(59759821449735512944,40967491029104)=412342768 intExtendEuclid(TBigInt*u,TBigInt*v,TBigInt*d, constTBigInt&bn1,constTBigInt&bn2); 扩展的Euclidean方法: 计算两个大整数bn1和bn2的最大公因子d以及伴随因子u和v,满足: |bn1|*u+|bn2|*v=d=gcd(|bn1|,|bn2|)。 u,v,d的值分别在输出参数u,v,d中返回。 TBigIntLehmer_gcd(constTBigInt&bn1,constTBigInt&bn2); Lehmer方法: 返回两个大整数bn1和bn2的最大公因子 TBigIntilcm(constTBigInt&bn1,constTBigInt&bn2); 返回两个大整数bn1和bn2的最小公倍数 示例: ilcm(120,65)=1560 ilcm(5,7)=35 有限域上的整数运算: (外部函数) 有限域上的算术运算: 1、特殊情形下的有限域上的算术运算: (允许任何整数类型的绝对值在一个计算机字长以内(例如小于65536)的输入值) 为了提高模运算的效率,对于一些常用的特殊情形下的有限域上的算术运算,以宏函数的方式实现: MODSUM(m,a,b) 返回模m下的整数a,b的和(非负表示) MODDIFF(m,a,b) 返回模m下的整数a,b的差(非负表示) MODPROD(m,a,b) 返回模m下的整数a,b的积(非负表示) MODSUM_0(m,a,b) 返回模m下的整数a,b的和(对称表示) MODDIFF_0(m,a,b) 返回模m下的整数a,b的差(对称表示) MODPROD_0(m,a,b) 返回模m下的整数a,b的积(对称表示) 2、一般情形下的有限域上的算术运算: (允许大整数类型的任意大小的输入值) TBigIntmod(constTBigInt&a,constTBigInt&m); TBigIntimod(constTBigInt&a,constTBigInt&m); 取模运算: 非负表示(theleastnon-negativerepresentation) 返回大整数a模m所得的值aa,且0<=aa 示例: mod(341414124124,29)=25 TBigIntmod_0(constTBigInt&a,constTBigInt&m); 取模运算: 对称表示(thezero-centeredrepresentation) 返回大整数a模m所得的值aa,且-m/2 示例: mod_0(341414124124,29)=-4 TBigIntmodular_sum(constTBigInt&m,constTBigInt&a,constTBigInt&b); 返回模m下的大整数a,b的和 示例: modular_sum(7,10,20)=2 modular_sum(7,100,200)=6 modular_sum(5,10,20)=0 TBigIntmodular_diff(constTBigInt&m,constTBigInt&a,constTBigInt&b); 返回模m下的大整数a,b的差 示例: modular_diff(7,10,20)=4 modular_diff(7,20,10)=3 modular_diff(5,10,20)=0 TBigIntmodular_prod(constTBigInt&m,constTBigInt&a,constTBigInt&b); 返回模m下的大整数a,b的积 示例: modular_prod(7,10,20)=4 modular_prod(10,8,9)=2 TBigIntmodular_quo(constTBigInt&m,constTBigInt&a,constTBigInt&b); 返回模m下的大整数a除以b的商 示例: modular_quo(7,100,5)=6 modular_quo(7,97,4)=5 TBigIntmodular_neg(constTBigInt&m,constTBigInt&a); 返回模m下的大整数a的相反数 示例: modular_neg(7,10)=4 modular_neg(9,10)=8 有限域上的平方根的计算: intSquareRootMod(inta,intp); 返回模p下的整数a的平方根之一,即返回整数x,满
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 目前 可以 处理 以下 种类
![提示](https://static.bdocx.com/images/bang_tan.gif)