资源简介
本来开发计算器,发现要用到大数运算,于是写了本代码。包括大数的加减乘除,开方,包括浮点,符合处理。纯C语言,在VS2010上测试OK,未知BUG若干。
代码片段和文件信息
#include
#include
#include
/*
有符号的加减法可以转化为无符号的加减法
小数可以用扩大10^n的整数表示
*/
/****************定义变量*********/
#define THIS_MAXLEN 100 //数组长度
#define SHOW_MAXLEN 50 //自我调整中使用的最大长度
#define DIV_PREC (THIS_MAXLEN-SHOW_MAXLEN) // 除法精度相关,循环取商最大次数 ,50 对应开方 17 的有效位
#define RESULT_TYPE signed char
#define RESULT_OK 0
#define RESULT_ERR_MEM 1
#define RESULT_ERR_DIVZERO 2
#define RESULT_ERR_MINUS 3
#define RESULT_ERR_OVERLEN 4
typedef struct
{
signed char len;//数据长度
signed char *num;
} bignumbase_st;
typedef struct
{
bignumbase_st baseT;
signed char symbol;//正负0正,1负
signed char exponent;//指数,10^e次方
} bignumESB_st;
/**********************************声明函数**********************/
/*******声明全局函数********/
//有符号大数加法
RESULT_TYPE bigNumADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数减法
RESULT_TYPE bigNumSUB(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数乘法
RESULT_TYPE bigNumMUL(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数除法
RESULT_TYPE bigNumDIV(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//根号2
RESULT_TYPE bigNumSQR(bignumESB_st *const pdstconst bignumESB_st *psrcconst signed char effec);
/*********声明内部函数********/
//无符号大数加法
static RESULT_TYPE nsbigADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数减法
static RESULT_TYPE nsbigSUB(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数乘法
static RESULT_TYPE nsbigMUL(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数除法
static RESULT_TYPE nsbigDIV(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//根号2
static RESULT_TYPE nsbigNumSQR(bignumESB_st *const pdstconst bignumESB_st *psrcconst signed char effec);
//比较数组代表的无符号整数的大小,a>b=1a=b=0astatic signed char arrcmp(const bignumbase_st *pa const bignumbase_st *pb );
//移动数组 改变长度
static void bigNumTenfold(bignumbase_st *const pdstconst bignumbase_st *psrcconst signed char exponent);
//去掉末尾的所有chart,返回去掉的数目
static signed char removeTailChart(signed char *pasigned char *plenconst char chart);
//去除开头的所有的字符chart返回去掉的数目
static signed char removeHeadChart(signed char *pasigned char *plenconst char chart);
//调整结构体,不改变表示的值,使exponent尽量靠近0
static void bignumst_adjust(bignumESB_st *const pdstconst unsigned char maxlen) ;
//设置结构体代数的有效位数
static void bignumst_valeffec( bignumESB_st *const pdstconst signed char effec) ;
/**************************************定义函数*******************************/
//有符号大数加法
RESULT_TYPE bigNumADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb)
{
RESULT_TYPE err;
if( pa->symbol == pb->symbol)
{
err=nsbigADD( pdst pa pb);
pdst->symbol = pa->symbol ;
}else
{
if ( pa->symbol ==0 ) // 正
- 上一篇:C语言模拟数据库系统DBMS
- 下一篇:二值化源代码
评论
共有 条评论