void FloatResolve(PEXTENDED pvalue, FloatRec *rec) { int power; double val; // 63位:双精度浮点数符号位,在第8个字节(小端存储,高高低低 ) rec->sign = *((LPBYTE)pvalue + 7) >> 7; //1为负,0为正 /*** 52-62位:双精度浮点数阶码(阶码 - 0x3ff = 二进制指数)***/ rec->exponent = (*(PUINT64)pvalue >> 52) & 0x7ff; if (!rec->exponent){ // E=0 | *pvalue = 0 rec->sign = 0; strcpy(rec->digits,"0000000000"); printf("%1.9E",*pvalue); return; } /****这种情况在后期基本不会出现,前期对非法数据已做处理*****/ if (rec->exponent == 0x7ff){// E=2047 | *pvalue = nan or inf if ((*(PUINT64)pvalue & 0x000fffffffffffff) == 0){ strcpy(rec->digits, "INF"); //无穷大,sign=1,负无穷;sign=0,正无穷 } else{ rec->exponent ++; rec->sign = 0; strcpy(rec->digits, "NAN"); } return; } //printf("sign=%d\n",rec->sign); // 阶码转换为十进制指数 rec->exponent = DECIMAL_EXP(rec->exponent); //printf("exponent=%d\n",rec->exponent); /* 0-51位:双精度浮点数尾数转换成F_MAXPRECISION位十进制浮点整数格式 */ val = *pvalue; *((LPBYTE)&val + 7) &= 0x7f; // val = fabs(*pvalue) /***指数微调***/ int tmpexp=rec->exponent; double tmpval=val; if( tmpexp > 0){ tmpval /= *(PEXTENDED)&_tab0[tmpexp & 31]; tmpexp >>= 5; if(tmpexp) tmpval /=*(PEXTENDED)&_tab1[tmpexp - 1]; if(tmpval < 1.0) rec->exponent --; else if(tmpval > 10.0) rec->exponent ++; }else if(tmpexp <0){
// 解析双精度浮点数为十进制字符串,并存入浮点数记录中 // 参数:浮点数指针,精度,小数位,浮点数记录 void FloatResolve(double *pvalue, int precision, int decimals, FloatRec *rec) { int power; double val; // 63位:双精度浮点数符号位 rec->negative = *((unsigned char *)pvalue + 7) >> 7; // 52-62位:双精度浮点数阶码(阶码 - 0x3ff = 二进制指数) rec->exponent = (*(unsigned long *)pvalue >> 52) & 0x7ff; if (!rec->exponent) // *pvalue = 0 { rec->negative = rec->digits[0] = 0; return; } if (rec->exponent == 0x7ff)// *pvalue = nan or inf { if ((*(unsigned long *)pvalue & 0xfffffffffffff) == 0) { strcpy(rec->digits, "INF"); } else { rec->exponent ++; rec->negative = 0; strcpy(rec->digits, "NAN"); } return; } // 阶码转换为十进制指数 rec->exponent = DECIMAL_EXP(rec->exponent); // 0-51位:双精度浮点数尾数转换成F_MAXPRECISION位十进制浮点整数格式 val = *pvalue; *((unsigned char *)&val + 7) &= 0x7f;// val = fabs(*pvalue) power = F_MAXPRECISION - rec->exponent; if (power > 0) // if (power > 0) val *= (10**power) { val *= *(double *)&_tab0[power & 31]; power >>= 5; // power /= 32; if (power) val *= *(double *)&_tab1[power - 1]; }