我编写了一个将双精度数转换为 BCD 的函数(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)但现在我想执行乘法和除法。但问题是只有字符作为数字(我不想改变它)。我现在必须像“纸上的乘法”(没有计算器的经典方法),但我认为它必须像模运算符的加法。另一方面,我不知道如何用带模的字符来实现它。有什么想法或提示吗?