我想将概率乘以0.9999 * 0.9955 * 0.6360 ... 作为固定点(无符号短16位,14位小数部分) 我想,我减少了太多。乘法后的值之间的哪一部分我应该采取进一步的乘法?
#include <stdio.h>
//#include <new>
#include <string.h>
#include <stdlib.h>
unsigned short zweihoch(short value) { //2^(12)
unsigned short ans = 1;
int i;
for (i = 0; i < value; i++) {
ans = 2 * ans;
}
return ans;
}
double zweihochneg(short value) { //2^(-12)
double ans = 1;
int i;
for (i = 0; i < -value; i++) {
ans = 2 * ans;
}
ans = 1 / ans;
return ans;
}
unsigned short umul16hi(unsigned short a, unsigned short b) //multiplication 16*16 stored in 16, takes the right 16 bits, normal mult cuts 16 left bits out
{
unsigned short ans = 0;
/* split operands into halves */
unsigned short al1 = a << 8;
unsigned short al = al1 >> 8;
unsigned short ah = a >> 8;
unsigned short bl1 = b << 8;
unsigned short bl = bl1 >> 8;
unsigned short bh = b >> 8;
/* compute partial products */
unsigned short p0 = al * bl;
unsigned short p1 = al * bh;
unsigned short p11 = p1 << 8;
unsigned short p1_s = p11 >> 8;
unsigned short p2 = ah * bl;
unsigned short p3 = ah * bh;
unsigned short p21 = p2 << 8;
unsigned short p2_s = p21 >> 8;
/* sum partial products */
unsigned short cy = ((p0 >> 8) + (unsigned short)p1_s + (unsigned short)p2_s) >> 8;
return ans = (p3 + (p2 >> 8) + (p1 >> 8) + cy);
}
int main()
{
unsigned short Prob_QAM = 0;
double Prob_double[6] = { 0.9999, 0.9955, 0.6360, 0.7767, 0.6700, 0.6057 };
unsigned short Prob[6] = Prob_double * zweihoch(12); // circa 4095 4077 2687 3181 2744 2480
Prob_QAM = umul16hi( Prob[0] , Prob[1] );
Prob_QAM = Prob_QAM * zweihoch(12); //cuts too much
Prob_QAM = umul16hi( Prob_QAM , Prob[2]) * zweihoch(12); //cuts too much
Prob_QAM = umul16hi( Prob_QAM , Prob[3]) * zweihoch(12); //cuts too much
Prob_QAM = umul16hi( Prob_QAM , Prob[4]) * zweihoch(12); //cuts too much
Prob_QAM = umul16hi( Prob_QAM , Prob[5]) * zweihoch(12); //cuts too much
Prob_QAM_double = 0.1995; //Prob_QAM must be like this
return 0;
}