2013-01-02 207 views
1

我寫了一個將double轉換爲BCD的函數(BCD:將double的每個數字保存爲無符號字符,另外還保存了完整的長度,分數長度(浮點後面的部分)和雙號的符號)。 我用下面的結構BCD算術運算

struct bcd_number 
{ 
unsigned int length; 
unsigned int fractional; 
signed char sign; 
unsigned char *digits; 
}; 

並且那雙到BCD功能:

struct bcd_number* double2bcd(double x) 
{ 
    char tmp[512]; 
    struct bcd_number* bcd = malloc (sizeof(struct bcd_number)); 

    int a = x; 
    double before = a; 
    double fractional; 
    fractional = x-(long)x; 


    bcd->digits = malloc (512); 

    char* z = (char*) bcd->digits; 


    sprintf (tmp,"%g",fabs(before)); 

    bcd->length = strlen(tmp); 
    bcd->sign = (before < 0) ? '-' : '+'; 

    for (size_t i=0; i<bcd->length; ++i) 
    { *z++ = tmp[i] - '0'; } 

    sprintf (tmp,"%g",fabs(fractional)); 

    for (size_t i = strlen(tmp)-1; i!=0; --i) 
    if (tmp[i] != '0') 
    { tmp[i+1] = 0; break; } 


    bcd->fractional = strlen(tmp+2); 
    bcd->length += bcd->fractional; 


    for (char* t = tmp + 2; *t; *z++ = *t++ - '0'); 
     bcd->digits = realloc (bcd->digits, bcd->length); 



    return bcd; 
} 

這完美的作品。

而且我還添加了預成型加/減的功能(完整的源代碼:http://pastebin.com/HR70VukM),但現在我想要進行乘法和除法。 但問題是,只有字符作爲數字(我不想改變)。我現在必須像'紙上的乘法'(沒有計算器的經典方法),但我有這樣的想法,它必須像模運算符一樣加法運算。另一方面,我不知道如何用模以字符來實現它。任何想法或提示?

+0

你真的應該刪除最初的'malloc()'。一旦知道了正確的大小,就可以轉換爲函數中的臨時緩衝區,然後轉換爲'malloc()',而不需要'realloc()'。更好的是,決定最大靜態尺寸並始終使用該尺寸,因爲您還要存儲長度。許多小的(10-30字節)分配可能非常昂貴並且無法管理。 – unwind

+0

具體問題是什麼並不是很清楚。如果你問「如何用十進制執行[長乘法](http://en.wikipedia.org/wiki/Long_multiplication#Long_multiplication)?」,那麼答案是「你可以用手做同樣的事情」 。 –

+0

好吧我想寫一個函數(例如:struct bcd_number * multiplication(struct bcd_number * a,struct bcd_number * b),它預處理了乘法,但是我遇到了「同樣的問題」手「的方式 – Kossi

回答

0

乘法和除法後是什麼?階乘?模?指數?自然對數?正弦?餘弦? 把BCD變成雙打,做任何數學運算,把結果轉換成BCD

0

你想知道關於BCD的所有信息都可以在網站General Decimal Arithmetic找到。

對於乘法,您需要一個原始程序,將兩個數字相乘得到兩位數結果。將此中間結果添加到答案中的適當位置。除了有一個「乘法表」之外,找到這個「合適的位置」是「你可以用手工完成」的方法的關鍵。