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

实验程序是用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);	//注意,此句会修改x3
	printf("(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);//注意,此句会修改x3
	printf("(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);//注意,此句会修改x3
	printf("(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);//注意,此句会修改q
	printf("q = x2/x1 = %s\n", str2);

	memset(str2, 0x00, sizeof(str2));
	XP_tostr(str2, 100, 10, N, r);//注意,此句会修改q
	printf("r = x2%%x1 = %s\n", str2);



	//XP_sum:
	//
	XP_sum(N, x3, x1, 100);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("(x3 = x1 + 100) = %s\n", str2);


	//XP_diff
	//
	XP_diff(N, x3, x1, 100);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("(x3 = x1 - 100) = %s\n", str2);

	//XP_product
	//
	XP_product(N, x3, x1, 255);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("(x3 = x1 * 255) = %s\n", str2);
	

	//XP_quotient:
	//
	XP_quotient(N, x3, x1, 50);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("(x3 = x1 / 50) = %s\n", str2);


	//XP_neg
	//
	XP_neg(N, x3, x1, 1);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("(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);//注意,此句会修改x3
	printf("XP_lshift = %s\n", str2);
	
	//XP_rshift
	//
	XP_rshift(N, x3, N, x1, 2/*移动的比特位*/, 0/*填充位*/);
	XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
	printf("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);


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值