BCD算术运算

BCD算术运算,c,math,bcd,C,Math,Bcd,我编写了一个函数,将double转换为BCD BCD:将double的每个数字保存为无符号字符,此外还保存完整长度、浮点数后面的小数部分和双精度数字的符号。 我使用以下结构 struct bcd_number { unsigned int length; unsigned int fractional; signed char sign; unsigned char *digits; }; 这就是双转BCD功能: struct bcd_number* double2bcd

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

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; 
} 
那很好用

我还添加了执行加法/减法的功能完整的源代码:但现在我想执行乘法和除法。
但问题是只有字符作为数字,我不想改变这一点。我现在认为,这一定像‘纸上乘法’的经典方法,没有计算器,但我的想法是,它一定像带模运算符的加法。另一方面,我不知道如何用带模的字符实现它。有什么想法或提示吗?

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

你想知道的关于BCD的一切都可以在网站上找到


对于乘法,您将需要一个将两个数字相乘的基本例程,以产生两位数的结果。将此中间结果添加到答案中的适当位置。除了有一个乘法表之外,找到这个合适的位置也是用手工方法实现的关键。

你真的应该删除初始malloc。在函数中执行到临时缓冲区的转换,然后在知道正确大小后执行malloc,这样就不需要realloc了。更好的是,确定最大静态大小并始终使用它,因为您还存储长度。许多10-30字节的小分配可能非常昂贵,管理起来效率也很低。具体问题是什么还不清楚。如果你问我如何用十进制计算,那么答案和你手工计算一样。好的,我想写一个函数,例如:struct bcd_number*乘法struct bcd_number*a,执行乘法的结构bcd_number*b,但我对它的实现有问题,你可以手工操作。@Kossi:你能展示一下你到目前为止的代码,并指出它不起作用的地方吗?或者,给出一个你不知道如何处理的数字例子。乘法的部分解决方法与手工乘法相同,就是存储并使用一个查找表来查找所有的单位数乘法,我称之为时间表。