首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BCD算术运算

BCD算术运算
EN

Stack Overflow用户
提问于 2013-01-02 21:13:13
回答 2查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
struct bcd_number 
{ 
unsigned int length; 
unsigned int fractional; 
signed char sign; 
unsigned char *digits; 
}; 

这就是double to BCD函数:

代码语言:javascript
复制
    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),但现在我想执行乘法和除法。但问题是,只有数字形式的字符(我不想改变这一点)。我现在肯定是像“纸上的乘法”(没有计算器的经典方法),但我的想法是它必须像模运算符的加法。另一方面,我不知道如何使用带模的字符来实现它。有什么想法或提示吗?

EN

回答 2

Stack Overflow用户

发布于 2013-01-03 01:09:29

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-03 02:06:41

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

对于乘法,您将需要一个基本例程,该例程将两位数相乘,得到两位数的结果。将此中间结果添加到答案中的适当位置。除了有一个“乘法表”之外,找到这个“合适的位置”是“手工式”方法的关键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14122715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档