2013-02-15 34 views
-2

我要读定点数任一4个字节或8个字节的,并针对每个项目(一个已知的位置)(号数)固定点数4个字节或8个字节,具有不同的比例因子 - 转换数字的库?

是否有这何处自动化库小数点移动的位置?

C/C++是选择

的语言例如:

这是假设的20

double toDoublePrecisionFixedPoint(short first,short second,short third,short forth) 
{ 
    double d = 0; 

    int top = (first << 0x10) | (second & 0x0000FFFF); 
    top/=8; 
    top >>= 8; 
    d+=top; 

    long long a = 0x0; 
    a = ((long long)second&0x07FF)<< 0x20; 
    long long t = 0x0; 
    t = (((long long)third) << 0x10) & 0xFFFF0000; 
    long long f = 0x0; 
    f = (((long long) forth)) & 0xFFFF; 
    long long bottom = a | t | f; 

    long long maxflag= 0x80000000000; 
    double dlong = (double)bottom/(double)maxflag; 
    d += dlong; 

    return d; 
} 

这是假设15 浮子toSinglePrecisionFixedPoint的标度的标度(短的第一,短秒) { float f;

float dec = ((float)second)/((float)0x10000); 

    f = (float)first; 

    if(f> 0 && dec >0) 
     f += dec; 
    else if(f >0 && dec <0) 
     f += (1 + dec); 
    else if(f < 0 && dec < 0) 
     f += dec; 
    else if(f < 0 && dec >0) 
     f -= (1 - dec); 
    else if(f == 0) 
     f += dec; 


    return f; 
} 


void floatToShorts(float f,short*ret) 
{ 
    ret[0] = 0x00; 
    ret[1] = 0x00; 
    ret[0] = (short)f; 
    double decimal = 0; 



    //THIS IS REMOVING THE WHOLE NUMBER 
    modf(f , &decimal); 
    ret[1] = (short)(decimal * 0x10000); 
} 

void doubleToShorts(double d,short*ret) 
{ 
    ret[0] = 0x00; 
    ret[1] = 0x00; 
    ret[2] = 0x00; 
    ret[3] = 0x00; 

    d*=0x80000000000; 
    long long l = (long long)d; 

    ret[0] = ((short)((l & 0xFFFF000000000000) >> 48)); 
    ret[1] = ((short)((l & 0x0000FFFF00000000) >> 32)); 
    ret[2] = ((short)((l & 0x00000000FFFF0000) >> 16)); 
    ret[3] = ((short)((l & 0x000000000000FFFF))); 
} 

这对我来说还好,直到我的项目现在需要一个可变比例的位置。这很好 - 但我只是好奇,如果有更好的方法来做到这一点?必须有一个完整的库

这很复杂很快,我可以很容易地胖手指的东西让我的代码不工作 - 我也肯定我没有尽可能多的错误检查,因为我应该 - 很好奇,如果有一个图书馆。

+1

也许你可以解释更多 - 用例子? – 2013-02-15 19:03:26

+0

np,编辑已作出感谢寻找 – morty346 2013-02-15 20:03:41

回答

1

也许你需要使用'bignum'库。可能是过度杀伤,但这里有一个例子:GMP

相关问题