Esempio n. 1
0
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];
    }