2013-02-15 35 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

相關問題