Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在哪里可以找到免费或开源的C++;图书馆做BCD数学? 我在哪里可以找到一个免费的或开源的C++库来做数学?< /P> < P>数学是数学-不要紧的是你在基础2中增加或乘法,在基础10或在基础16中:答案总是相同的。_C++_Open Source_Bcd - Fatal编程技术网

在哪里可以找到免费或开源的C++;图书馆做BCD数学? 我在哪里可以找到一个免费的或开源的C++库来做数学?< /P> < P>数学是数学-不要紧的是你在基础2中增加或乘法,在基础10或在基础16中:答案总是相同的。

在哪里可以找到免费或开源的C++;图书馆做BCD数学? 我在哪里可以找到一个免费的或开源的C++库来做数学?< /P> < P>数学是数学-不要紧的是你在基础2中增加或乘法,在基础10或在基础16中:答案总是相同的。,c++,open-source,bcd,C++,Open Source,Bcd,我不知道您的输入和输出将如何编码,但您所需要的只是从BCD转换为整数,像往常一样进行计算,最后再从整数转换为BCD。给您。我刚刚写了这篇文章,并将其公之于众 它将无符号bcd转换为无符号整数,反之亦然。使用bcd2i()将BCD转换为无符号整数,执行所需的任何数学运算,然后使用i2bcd()将数字恢复为BCD unsigned int bcd2i(unsigned int bcd) { unsigned int decimalMultiplier = 1; unsigned in

我不知道您的输入和输出将如何编码,但您所需要的只是从BCD转换为整数,像往常一样进行计算,最后再从整数转换为BCD。

给您。我刚刚写了这篇文章,并将其公之于众

它将无符号bcd转换为无符号整数,反之亦然。使用bcd2i()将BCD转换为无符号整数,执行所需的任何数学运算,然后使用i2bcd()将数字恢复为BCD

unsigned int bcd2i(unsigned int bcd) {
    unsigned int decimalMultiplier = 1;
    unsigned int digit;
    unsigned int i = 0;
    while (bcd > 0) {
        digit = bcd & 0xF;
        i += digit * decimalMultiplier;
        decimalMultiplier *= 10;
        bcd >>= 4;
    }
    return i;
}

unsigned int i2bcd(unsigned int i) {
    unsigned int binaryShift = 0;  
    unsigned int digit;
    unsigned int bcd = 0;
    while (i > 0) {
        digit = i % 10;
        bcd += (digit << binaryShift);
        binaryShift += 4;
        i /= 10;
    }
    return bcd;
}
// Thanks to EmbeddedGuy for bug fix: changed init value to 0 from 1 


#include <iostream>
using namespace std;

int main() {
int tests[] = {81986, 3740, 103141, 27616, 1038, 
               56975, 38083, 26722, 72358, 
                2017, 34259};

int testCount = sizeof(tests)/sizeof(tests[0]);

cout << "Testing bcd2i(i2bcd(test)) on 10 cases" << endl;
for (int testIndex=0; testIndex<testCount; testIndex++) {
    int bcd = i2bcd(tests[testIndex]);
    int i = bcd2i(bcd);
    if (i != tests[testIndex]) {
        cout << "Test failed: " << tests[testIndex] << " >> " << bcd << " >> " << i << endl;
        return 1;
    }
}
cout << "Test passed" << endl;
return 0;
}
unsigned int bcd2i(unsigned int bcd){
无符号整数小数乘法器=1;
无符号整数位数;
无符号整数i=0;
而(bcd>0){
数字=bcd&0xF;
i+=数字*小数乘法器;
小数乘法器*=10;
bcd>>=4;
}
返回i;
}
无符号整数i2bcd(无符号整数i){
无符号int-binaryShift=0;
无符号整数位数;
无符号整数bcd=0;
而(i>0){
数字=i%10;

bcd+=(据我所知,转换错误并不总是可以接受的。由于无法避免错误,BCD计算有时是必须的。例如,XBCD_Math是一个功能齐全的BCD浮点库。

Thank you@levis501。BCD的一个优点是,数字与整数不同,大小不限,因此转换为int可以执行数学运算函数将是有限的。非常方便的代码为+1。好奇的是,你的BCD是如何存储的?只需稍加修改,代码就可以很容易地转换为数据的内存数组,然后应用任意精度库进行计算。谢谢,任意精度数学库的列表很好。我认为任意精度库将这是一个很大的帮助。@Richard Brightwell:“BCD”并没有要求任意精度。如果你的最终目标是任意精度,那么就使用任意精度库,比如GMP(在内部它将使用base 2^16或base 2^32或其他方便的工具,但不是base 10)。BCD数字可能大于整数。因此,需要直接对以BCD格式存储的值执行数学函数。下面是处理“大”的匹配库数字:。如果64位足够,您也可以使用boost::int64\t。不需要使用BCD进行此操作-除非如果您自己实现,手动验证计算可能会更容易:)或者此库:。我对这两个库都没有任何经验。谢谢Warpin。我认为任意精度的数学库与Levis的代码相结合就可以了。+1用于大型数学库。当二进制和十进制之间转换所需的处理量相当于或大于e进行实际计算所需的数量。例如,如果您想编写一个函数,计算1到50000000之间n的2^n十进制表示中的7个数,那么在BCD中进行一系列加法可能比进行一系列二进制到十进制转换更好,特别是考虑到缓存效应和并行计算的机会。你们应该在那个里问你们的问题。