Dove posso trovare un libero o open source C ++ biblioteca per fare BCD matematica? [chiuso]

StackOverflow https://stackoverflow.com/questions/6302195

  •  25-10-2019
  •  | 
  •  

Domanda

Dove posso trovare un libero o open source C ++ biblioteca per fare decimale codificato in binario matematica?

È stato utile?

Soluzione

Qui si va. Ho appena scritto questo, e sto facendo è di dominio pubblico.

Si converte un BCD senza segno a un unsigned int e viceversa. Usa bcd2i () per convertire i vostri BCDs a unsigned int, fare tutto ciò che è necessario per la matematica, quindi utilizzare i2bcd () per portare i numeri di nuovo a 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;
}

Altri suggerimenti

Per quanto ne so, gli errori di conversione non sono sempre accettabili. Come gli errori non possono essere evitati, calcoli BCD sono a volte un must. XBCD_Math, per esempio, è una libreria in virgola mobile BCD completamente descritto.

La matematica è la matematica - non importa è che si aggiunge o si moltiplicano in base 2, in base 10 o in base 16:. La risposta è sempre la stessa

Non so come il vostro ingresso e di uscita sarebbero stati codificati, ma tutto quello che dovrebbe essere necessario è convertito da BCD in numero intero, fare la matematica, proprio come si farebbe normalmente, e alla fine ri-convertire da intero a BCD.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top