由于编程语言常用类型的位数限制,精度收到很大的局限。只能在一定的数据范围内进行运算,超出这个范围回导致数据失真。
在进行图像编码的过程遇到了这样问题,写了两个小程序,很多地方都需要优化,不过在一定的测试条件下还可以用。
/功能:大数据相乘
//参数:相乘的两个数,用vector存储数据的每一位
//返回:相乘结果,用一个vector存储结果的每一位
vector<int> MyMath::BigDataMul(const vector<int> &InputData1,const vector<int> &InputData2)
{
vector<vector<int>> DataBuffer;
vector<int> mdataBuffer;
for (unsigned int i(0);i<InputData2.size();i++)
{
int midBit = InputData2[i];
int giveBit(0);
for (unsigned int j(0);j<InputData1.size();j++)
{
mdataBuffer.push_back(giveBit + InputData1[j]*midBit%10);
giveBit = InputData1[j]*midBit/10;
}
if (giveBit)
{
mdataBuffer.push_back(giveBit);
}
DataBuffer.push_back(mdataBuffer);
mdataBuffer.clear();
}
mdataBuffer = DataBuffer[0];
int Themid;
for (unsigned int i(1);i<DataBuffer.size();i++)
{
unsigned int mdataBufferSize = mdataBuffer.size();
unsigned int j(i),k(0),GiveBit(0);
for (;j<mdataBufferSize;j++,k++)
{
Themid = mdataBuffer[j] + DataBuffer[i][k] + GiveBit;
GiveBit = Themid/10;
mdataBuffer[j] = Themid%10;
if (j == mdataBufferSize-1)
{
if (k == DataBuffer[i].size()-1&&GiveBit)
{
mdataBuffer.push_back(GiveBit);
}
else
{
for (unsigned int l(k+1);l<DataBuffer[i].size();l++)
{
int Themid1 = GiveBit + DataBuffer[i][l];
mdataBuffer.push_back(Themid1%10);
GiveBit = Themid1/10;
}
if (GiveBit)
{
mdataBuffer.push_back(GiveBit);
}
}
}
}
}
return mdataBuffer;
}
//功能:大数据相加
//参数:相加的两个数,用vector存储数据每一位
//返回:两数的和,用vector存储结果每一位
vector<int> MyMath::BigDataAdd(const vector<int> &InputData1,const vector<int> &InputData2)
{
vector<int> AddResult;
int nData1Size = InputData1.size();
int nData2Size = InputData2.size();
int GiveBit(0);
if (nData1Size>nData2Size)
{
int nSizeDiff = nData1Size - nData2Size;
AddResult = InputData1;
for (int i(0);i<nData2Size;i++)
{
int temp = InputData2[i] + InputData1[i+nSizeDiff] + GiveBit;
AddResult[i+nSizeDiff] = temp%10;
GiveBit = temp/10;
}
if (GiveBit)
{
AfxMessageBox(_T("相加之后越界,不再纯小数,请校验输入和输出"));
}
}
else
{
int nSizeDiff = nData2Size - nData1Size;
AddResult = InputData2;
for (int i(0);i<nData1Size;i++)
{
int temp = InputData1[i] + InputData2[i+nSizeDiff] + GiveBit;
AddResult[i+nSizeDiff] = temp%10;
GiveBit = temp/10;
}
if (GiveBit)
{
AfxMessageBox(_T("相加之后越界,不再纯小数,请校验输入和输出"));
}
}
return AddResult;
}
乘法思想就是用第一个数的每一位对第二个数进行相乘,并把结果存储下来,然后对这些结果进行错位相加。
加法的思想就是按位相加,注意位数和进位就好了。这里用的是vector进行性能分析的时候,相当耗时和内存。可以考虑采用其他数据结构进行实现。