————彭晓林
算法需求分析:编程语言所带的计算精度不够高,从顶层浮点数转换到底层控制器寄存器值,由于精度问题导致信号误差过大导致信号精度问题(如AD转换数据,配给fpga寄存器数据等)。
此算法是我从网上代码修改而来,用来适应我现在项目中的代码。其中精度为 3 位65536 进制数据。
#include "stdafx.h"
#include<stdio.h>
#include<memory.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define MAX 8//至少是所表示位数精度的两倍
#define DEC 10
#define HEX 16
const unsigned int LARGE = 65536;//LARGER=65536^(G-1)
#define G 2 //65536^(G-1)进制
class BigInt{
public:
unsigned len;
unsigned int v[MAX];//至少是表示精度数据类型的两倍
int sign;//记录数值符号
int rec;//记录除数是否为0
BigInt();
~BigInt();
/**************************
重载了三个赋值运算
调用各运算时要先由Mov()函数将他们转化存储到数组v里面
**************************/
void Mov(BigInt& A);
void Mov(char*A);
void Mov(int A);
void Copy(BigInt& A,int bg,int n);
BigInt Add(BigInt& A);
BigInt Sub(BigInt& A);
BigInt Mul(BigInt& A);
BigInt Div(BigInt& A,BigInt& L);
//比较函数
int Cmp(BigInt& A);
int Cmp(BigInt& A,int b,int l);//b是A.v数组中开始比较的位数,l是结束比较的位置
void Display();
};
BigInt::BigInt(){
len=1;
for(int i=0;i<MAX;i++){
v[i]=0;
}
}
BigInt::~BigInt(){
}
int BigInt::Cmp(BigInt& A){
if(len>A.len)return 1;
if(len<A.len)return -1;
for(int i=len-1;i>=0;i--){
if(v[i]>A.v[i])return 1;
if(v[i]<A.v[i])return -1;
}
return 0;
}
int BigInt::Cmp(BigInt&A,int b,int l){
if(len>l-b+1)return 1;
if(len<l-b+1)return -1;
int j=l;
for(int i=len-1;i>=0;i--,j--){
if(v[i]>A.v[j]){return 1;}
if(v[i]<A.v[j])return -1;
}
return 0;
}
void BigInt::Mov(int A){
v[0]=A;
int i,k;
k=A;
i=0;
while(k>0){
v[i]=k-k/LARGE*LARGE;
k=k/LARGE;
i++;
}
len=i;
}
void BigInt::Mov(BigInt& A){
len=A.len;
int i = 0;
for(i=0;i<len;i++){
v[i]=A.v[i];
}
while(i<MAX){
v[i]=0;
i++;
}
}
void BigInt::Mov(char *A){
int A_len=strlen(A);
int k,i,j,t;
len=A_len/(G-1);
if(A_len%(G-1))len++;
for(i=0,j=A_len-1;i<len&&j>=0;i++){
k=1;
t=1;
while(j>=0&&k<G){
v[i]+=(A[j]-'0')*t;
t*=10;
j--;
k++;
}
}
}
BigInt BigInt::Add(BigInt& A){
BigInt X;
X.Mov(*this);
int sum=0;
int carry=0;
if(X.len<A.len){
X.len=A.len;
}
for(int i=0;i<=X.len;i++){
sum=A.v[i];
sum=sum+X.v[i]+carry;
X.v[i]=sum%LARGE; //10^(G-1)进制
carry=sum/LARGE;
}
if(X.v[X.len]){
X.len++;
}
return X;
}
BigInt BigInt::Sub(BigInt& A){
BigInt X;
BigInt T;
X.sign=0;
X.Mov(*this);
T=X;
if(X.Cmp(A)<0){
X.sign=1;
BigInt Y;
Y.Mov(X);
X.Mov(A);
A.Mov(Y);
T=X;
}
int carry=0;
for(int i=0;i<X.len;i++){
if((T.v[i]>=A.v[i]+carry)){
X.v[i]=T.v[i]-carry-A.v[i];
carry=0;
}
else{
X.v[i]=LARGE+T.v[i]-A.v[i]-carry;
carry=1;
}
}
while(X.v[X.len-1]==0&&X.len>1)X.len--;
return X;
}
BigInt BigInt::Mul(BigInt& A){
BigInt X;
int rec;
int carry=0;
int i,j;
X.len=len+A.len;
for(i=0;i<X.len;i++){
X.v[i]=0;
}
for(i=0;i<len;i++){
for(j=0;j<A.len;j++){
X.v[i+j]+=v[i]*A.v[j];
}
}
for(i=0;i<X.len;i++){
rec=X.v[i]+carry;
X.v[i]=rec%LARGE;
carry=rec/LARGE;
}
while(X.len>1&&X.v[X.len-1]==0){
X.len--;
}
return X;
}
BigInt BigInt:: Div(BigInt& A,BigInt& X){//X保存余数;
BigInt S;//S保存商;
BigInt Y;
X.Mov(*this);
X.rec=0;
S.Mov(0);
if(A.Cmp(S)==0){
X.rec=1;
return X;
}
if(X.Cmp(A)<0){
S.Mov(0);
}
else{
S.len=X.len-A.len+1;
int l=A.len;
int i,j,t,k,g,c,h;
int carry;
c=0;
//模拟除法,避免高精度乘法,用减法运算,不过用高精度乘法应该会更快一点
for(i=X.len-1,j=S.len-1;i>=A.len-1&&j>=0;i--,j--){
t=0;h=2;
X.v[i]+=c*LARGE;
while(A.Cmp(X,i-A.len+1,i)<=0){
if(A.Cmp(X,i-A.len+1,i)>0)break;
carry=0;
for(k=0,g=i-A.len+1;k<A.len;k++,g++){
if((X.v[g]>=A.v[k]+carry)){
X.v[g]=X.v[g]-carry-A.v[k];
carry=0;
}
else{
X.v[g]=LARGE+X.v[g]-A.v[k]-carry;
carry=1;
}
}
t++;
}
Y.Mov(X);
c=X.v[i];
X.v[i]=0;
X.len--;
S.v[j]=t;
}
while(S.v[S.len-1]==0&&S.len>1)S.len--;
X.Mov(Y);
while(X.v[X.len-1]==0&&X.len>1)X.len--;
}
return S;
}
void BigInt::Display(){
for(int i=len-1;i>=0;i--){
printf("%d ",v[i]);//printf("%0(G-1)d",v[i]);当G=3时为100进制,则printf("%02d",v[i];
}
printf("\n");
}
class TEST{
public:
void add(BigInt& A,BigInt B){
BigInt C = A.Add(B);
C.Display();
}
void cmp(BigInt& A,BigInt B){
int i=A.Cmp(B);
if(i==1)printf("A>B\n");
if(i==0)printf("A==B\n");
if(i==-1)printf("A<B\n");
}
void sub(BigInt& A,BigInt B){
BigInt C = A.Sub(B);
if(C.sign)printf("-");
C.Display();
}
void mul(BigInt& A,BigInt& B){
BigInt C = A.Mul(B);
C.Display();
}
void div(BigInt& A,BigInt& B){
BigInt X;
BigInt C = A.Div(B,X);
if(C.rec==1){
printf("除数为0\n");
}
else{
printf("商:\n");
C.Display();
printf("余数:\n");
X.Display();
}
}
};
int main(){
int g,h;
TEST test;
while(1){
BigInt a;
a.v[0] = 0;
a.v[1] = 0;
a.v[2] = 65535;
a.len = 3;
BigInt b;
b.v[0] = 0;
b.v[1] = 65535;
b.v[2] = 0;
b.len = 3;
a.Display();
b.Display();
printf("test A + B\n");
test.add(a,b);
printf("test A - B\n");
test.sub(a,b);
printf("test A * B\n");
test.mul(a,b);
printf("test A/B\n");
test.div(a,b);
}
return 0;
}
分享到:
相关推荐
"java高精度计算算法与分析" java高精度计算是指在java编程语言中对数字进行高精度计算的方法和技术。高精度计算是指在计算过程中保持尽可能高的精度,以避免计算结果的不确定性和差异。java高精度计算通常是指使用...
各种常用算法、排序算法、精度计算代码、广度优先搜索模版 等等。
黄金分割数的高精度计算算法,包括模拟笔算开平方、二分法、牛顿迭代法和级数展开法等。模拟笔算开平方是模拟人工笔算开方的过程来获取结果,二分法则是通过区间不断对分来逼近真实值的方法,牛顿迭代法是利用迭代...
通过阅读和分析代码,你可以看到高精度计算算法的具体实现,了解如何在实际编程中处理这些问题。此外,这也可以作为练习,帮助你提升编程能力和算法理解。 总的来说,高精度计算是一门既基础又深入的计算机科学主题...
本算法还可优化,为了容易理解未作进一步优化 21位一分钟
在标题"高精度_高精度算法 c_高精度计算"中,我们可以理解为这个压缩包包含了一个C语言编写的程序,专门用于处理高精度计算任务。C语言虽然原生不支持大整数,但通过编程技巧可以实现这一功能。 描述中的"本程序...
标题中的“28335高精度计算代码”指的是基于TI(Texas Instruments)TMS320C28335数字信号处理器(DSP)的高精度计算算法实现。TI的C28335是一款高性能、低功耗的16位定点DSP,常用于实时信号处理应用,如音频、视频...
高精度算法全集(C语言)提供了一系列高精度算法的实现,能够满足高精度数据的运算需求,并且可以应用于各种领域,如科学计算、金融计算、加密算法等。 知识点: * 高精度算法 * 高精度加法运算 * 高精度减法运算 ...
例如,可以编写高精度计算算法,避免浮点数运算时的精度损失;也可以实现数值积分、微分方程求解、最优化问题等复杂算法。 5. **并行计算**:利用C#的Task Parallel Library (TPL) 和 `Parallel` 类,可以将数值...
本文将深入探讨与"TM7711厨房秤0.1克高精度滤波算法(c语言)"相关的技术知识,以及如何通过C语言实现这种滤波算法。 首先,TM7711是一款专门用于厨房秤的高精度传感器,能够精确测量到0.1克的重量变化。这意味着它...
综上所述,结合FFT与Chirpz变换的FMCW雷达快速高精度测距算法,通过优化计算流程和引入相位模糊性校正策略,有效解决了传统方法中的精度与计算量之间的矛盾,为FMCW雷达在高精度实时测距应用领域提供了强有力的技术...
在IT领域,尤其是在编程竞赛和算法设计中,高精度计算是一项至关重要的技能。高精度计算涉及处理超过标准数据类型所能表示的数值范围的计算,通常用于解决数学问题、科学计算或者金融领域的精确计算等。本章节我们将...
这个库采用了gmp(GNU Multiple Precision Arithmetic Library)的算法,gmp是开源社区广泛使用的高精度计算库,以其高效和精确著称。 高精度计算库的核心在于能够处理超出标准数据类型(如int、long或double)表示...
高精度计算在很多领域都有应用,如金融计算、密码学、科学计算等,特别是在需要极高精度或者处理大整数的场景下,自定义高精度计算算法显得尤为重要。通过理解和掌握这类算法,可以帮助我们更好地应对这些挑战。
的高精度算法涉及到了数据结构的选择(如使用Comp类型),算法优化(如连乘的复杂度分析、设置缓存和分解质因数等),以及在Pascal环境中实现高精度计算的方法。理解和掌握这些概念与技巧,对于处理大整数计算和算法...
e的高精度C++算法,可以自己输入精确位数,自己认为算法的效率还是很高地~~~
在C++中,由于标准库提供的`<cstdint>`类型如`int64_t`或`uint64_t`等无法满足非常大的整数运算需求,程序员需要自定义数据结构和算法来实现高精度计算。本示例将重点介绍基于一位一存的高精度加法、减法、乘法以及...
在计算机科学中,高精度计算通常涉及大整数运算、浮点数的高精度表示以及相关的算法优化。这类计算在密码学、物理学、工程学和金融等领域都有广泛应用。 描述中的“强大的hugecalc!”暗示了这是一个名为“HugeCalc...