我写了一个函数,它将双精度数字转换为BCD(BCD:将双精度数字的每个数字保存为无符号字符,另外还保存完整长度、小数长度(部分位于浮点后面)和双精度数字的符号)。
我使用以下结构

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),但现在我想执行乘法和除法运算。
但问题是,只有字符作为数字(我不想改变)。我现在必须像“纸上的乘法”(不带计算器的经典方法),但我有一个想法,那就是它必须像加上模算符。另一方面,我不知道如何用带模的字符实现它。有什么想法或暗示吗?

最佳答案

乘法和除法之后是什么?阶乘?模数?指数?自然对数?正弦?余弦?
把BCD转换成双倍,做任何数学运算,把结果转换成BCD

关于c - BCD算术运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14122715/

10-14 09:38