《C语言接口与实现》实验——扩展精度算术(XP_T)

来源:互联网 发布:mac os x镜像文件iso 编辑:程序博客网 时间:2024/05/05 04:59

实验程序是用vc6编译,一定注意文件扩展名为c,不是cpp,源码可以下载前面几个测试程序(链表、表、原子中有下载链接)中直接将下面源程序覆盖1.c的内容即可!

再次强烈建议在这些函数上设上断点,按F11跟进去把源码走一遍,才有真正的学习效果!


源程序如下:

#include <stdio.h>#include <stdlib.h>//rand函数使用#include <string.h>#include "include/Xp.h"#pragma comment(lib, "libcii.lib")//定义15个无符号字节,理论上,使用XP_T可以表达1.3292279957849158729038070602803e+36(注意36位),足够做实验了!//定义N=1的话,是255;//定义N=2的话,是256*256-1 = 65535//....................//#define N(15)void main(){//注意:C语言一定要将这些变量声明放在函数的头部int i = 0;XP_T x1, x2, x3;XP_T q, r, tmp;unsigned long k = 0;char   *str1, *stopstring;char str2[100] = {0};////因为作者不建议使用XP_T接口(P232:建议使用AP接口或MP接口)。//如果一定要使用,那么首先要初始化//XP_T变量,该接口没有初始化XP_T的接口//XP_T 定义是 unsigned char *类型,很简单//x1 = (XP_T)malloc(N);x2 = (XP_T)malloc(N);x3 = (XP_T)malloc(2*N);q = (XP_T)malloc(N);r = (XP_T)malloc(N);tmp = (XP_T)malloc(N);//将一个数值来初始化x1,实际上是把整个数放到x1里//后面再把它取出来,检验是否正确?XP_fromint(N, x1, 1000000000);k = XP_toint(N, x1);printf("k = %ld\n", k);//用数值0来初始化x2,x3//就是初始化成{0x00, 0x00, 0x00, ......}//XP_fromint(N, x2, 0);XP_fromint(2*N, x3, 0);//用字符串来设置x2//str1 = "1199000999933388833922999888444441234";str1 = "22333334444433333333331234";XP_fromstr(N, x2, str1, 10, &stopstring);//转换到串并打印出来检查是否正确//注意:下面XP_tostr修改 x2的内容//所以,如果后面还要用到x2,就要把下面这一句注释掉////XP_tostr(str2, 100, 10, N, x2);//printf("x2 = %s\n", str2);//加法:x3 = x2 + x1,并打出来检验//最后一位是进位(carry),用于高级接口使用的,这里单独测试,赋值0即可//XP_add(N, x3, x2, x1, 0);memset(str2, 0x00, sizeof(str2));XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x2 + x1) = %s\n", str2);//减法:x3 = x2 - x1,并打出来检验//XP_sub(N, x3, x2, x1, 0);memset(str2, 0x00, sizeof(str2));XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x2 - x1) = %s\n", str2);//乘法:x3 = x2 * x1,并打出来检验//做此操作时,将上面的加减法先注释掉;//另外,注意上面解释过的,不要超过36位,否则越位溢出XP_mul(x3, 2*N, x2, N, x1);memset(str2, 0x00, sizeof(str2));XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x2 * x1) = %s\n", str2);//除法:q = x2/x1 (取整),r = x2%x1(取余)并打出来检验//做此操作时,将上面的加减法先注释掉;//先打印取整,再打印取余的值//XP_div(N, q, x2, N, x1, r, tmp);memset(str2, 0x00, sizeof(str2));XP_tostr(str2, 100, 10, N, q);//注意,此句会修改qprintf("q = x2/x1 = %s\n", str2);memset(str2, 0x00, sizeof(str2));XP_tostr(str2, 100, 10, N, r);//注意,此句会修改qprintf("r = x2%%x1 = %s\n", str2);//XP_sum://XP_sum(N, x3, x1, 100);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x1 + 100) = %s\n", str2);//XP_diff//XP_diff(N, x3, x1, 100);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x1 - 100) = %s\n", str2);//XP_product//XP_product(N, x3, x1, 255);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x1 * 255) = %s\n", str2);//XP_quotient://XP_quotient(N, x3, x1, 50);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = x1 / 50) = %s\n", str2);//XP_neg//XP_neg(N, x3, x1, 1);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("(x3 = ~x1) = %s\n", str2);//XP_cmp//需将前面转换打印(XP_tostr)用到x1, x2的地方注释掉//printf("XP_cmp = %d\n", XP_cmp(N, x2, x1));//XP_lshift//XP_lshift(N, x3, N, x1, 2/*移动的比特位*/, 0/*填充位*/);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("XP_lshift = %s\n", str2);//XP_rshift//XP_rshift(N, x3, N, x1, 2/*移动的比特位*/, 0/*填充位*/);XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3printf("XP_lshift = %s\n", str2);//XP_length//printf("XP_length(x1) = %d\n", XP_length(N, x1));//下面打印出x1里的内容验证for(i=0; i<N; i++)printf("%02x, ", x1[i]);printf("\n检验是否一致:%ld\n",0 + 0xca*256 + 0x9a*256*256 + 0x3b*256*256*256);}


原创粉丝点击