【问题标题】:BCD arithmetic operationsBCD算术运算
【发布时间】:2012-12-16 20:37:34
【问题描述】:

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

【问题讨论】:

  • 你真的应该删除最初的malloc()。在函数中转换为临时缓冲区,然后在知道正确大小后malloc(),无需realloc()。更好的是,决定最大静态大小并始终使用它,因为您还存储了长度。许多小的(10-30 字节)分配可能非常昂贵且管理效率低。
  • 不清楚具体问题是什么。如果您问“我如何以十进制执行long multiplication?”,那么答案是“与您手动执行相同”。
  • 好的,我想编写一个函数(例如:struct bcd_number* multiplication (struct bcd_number *a, struct bcd_number *b) 来执行乘法,但是我在执行“the同样你会用手做”-方式。
  • @Kossi:你能展示你目前拥有的代码,并指出它在哪里不起作用吗?或者,给出一个你不知道如何处理的数字示例。
  • 部分解决方案以与手动操作相同的方式进行乘法是存储和使用所有一位数乘法的查找表,什么我会调用一个时间表

标签: c math bcd


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    乘法和除法之后会发生什么?阶乘?模数?指数?自然对数?正弦?余弦? 将 BCD 变回双精度数,进行任何数学运算,将结果转换为 BCD

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多