1

double を BCD に変換する関数を作成しました (BCD: double の各桁を unsigned char として保存し、さらに、完全な長さ、小数部の長さ (浮動小数点の後ろの部分)、および double の符号を保存します) )。次の構造体を使用します

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

そして、それが double to 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 ) が、乗算と除算を実行したいと考えています。しかし問題は、数字として文字しかないことです (私はそれを変更したくありません)。私は今、それは「紙の上の掛け算」(計算機を使わない古典的な方法) のようなものでなければなりませんが、モジュロ演算子を使った足し算のようなものでなければならないという考えを持っています。一方、モジュロ付きの文字で実装する方法がわかりません。アイデアやヒントはありますか?

4

2 に答える 2

0

BCD について知りたいと思ったことはすべて、General Decimal Arithmetic Web サイトで見つけることができます。

乗算の場合、2 桁を掛け合わせて 2 桁の結果を得るプリミティブ ルーチンが必要です。この中間結果を回答の適切な位置に追加します。「かけ算の九九」を持つことに加えて、この「適切な位置」を見つけることは、「手で行うのと同じ」方法の核心です。

于 2013-01-02T18:06:41.400 に答える
0

掛け算と割り算の次は何?階乗?係数?指数?自然対数?正弦?余弦?BCD を double に戻し、あらゆる数学演算を実行し、結果を BCD に変換します

于 2013-01-02T17:09:29.043 に答える