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