BCD算术运算

时间:2013-01-02 13:13:13

标签: c math bcd

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以在General Decimal Arithmetic网站上找到有关BCD的所有信息。

对于乘法,您需要一个原始例程,它将两位数相乘,产生两位数的结果。将此中间结果添加到答案中的适当位置。除了有一个“乘法表”,找到这个“适当的位置”是“同样你手工做”的方法的关键。

相关问题