Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

di il
21 risposte

Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

Non ho trovato molto su internet sul sistema BCD. Qualcuno sa darmi qualche informazione in più?

21 Risposte

  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    https://it.wikipedia.org/wiki/Binary-coded_decima

    Che cosa vuoi sapere?

    Ottimo per i calcoli finanziari, al contrario del float e del double usato dal programmatore medio (e SBAGLIA!!!).
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    Nella codifica BCD, il valore di ogni cifra di un numero decimale viene memorizzato su 4 bit (o talvolta 8, nei casi sia difficile lavorare su metà byte o se si vuole rendere più semplice la stampa delle cifre). Quindi, ad esempio, nella versione che usa 4 bit per cifra, 7492 sarebbe 0111 0100 1001 0011.

    Come detto da migliorabile, BCD viene utilizzato nei software finanziari perché un numero frazionario che in decimale ha un numero di cifre dopo la virgola finito, in binario potrebbe avere lunghezza infinita, e troncandolo l'errore può essere piuttosto grande, per cui su milioni di transazioni potrebbero sparire somme di denaro considerevoli. In BCD invece non si pone il problema.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    dvaosta ha scritto:


    Nella codifica BCD, il valore di ogni cifra di un numero decimale viene memorizzato su 4 bit (o talvolta 8, nei casi sia difficile lavorare su metà byte o se si vuole rendere più semplice la stampa delle cifre).
    Nel primo caso si parla esplicitamente di packed BCD, mentre nel secondo ci si riferisce ad unpacked BCD. Molto importante notare che le ISA di numerose CPU CISC, incluse quelle usate nel mainstream (Intel, AMD e cloni vari ante-Pentium) contengono un subset di istruzioni dedicate per eseguire operazioni aritmetiche direttamente in unpacked BCD.

    BCD è per natura un classico formato intermedio, usato non solo per effettuare direttamente operazioni aritmetiche (sia in hardware, sia tramite firmware o microcodice), ma anche e soprattutto per la comunicazione tra layer software (o sottosistemi) di calcolo e di presentazione. Ad esempio, un tipico formato di output da uno smart sensor (trasduttore localmente governato da una MCU baseline dedicata) può prevedere l'invio on-demand in packed BCD del risultato della misura corrente sul canale di comunicazione fisico verso la MCU (IIC, SPI, 1-Wire, seriale asincrona, etc), facilitandone in pari misura sia la visualizzazione immediata, sia la memorizzazione ed elaborazione, garantendo così un ottimo livello di interoperabilità ad un costo elaborativo ampiamente accettabile per un qualsiasi sistema embedded.

    Il formato BCD è peraltro una delle numerose famiglie regolate dallo standard ANSI/IEEE 854, erede ed evoluzione del più noto e diffuso IEEE 754 relativo al formato binario floating point. Come già accennato, i formati coperti dallo standard 854 non soffrono dei problemi di errore d'accumulo e troncamento che caratterizzano il classico FP binario, e per tale motivo sono ampiamente usati a livello software fin dai tempi del COBOL per numerose classi di applicazioni finanziare e burotiche. Come già ricordato recentemente su questi stessi forum, negli ultimi anni sono fioriti anche vari processori di fascia alta (architetture PPC per supercomputer Z10 IBM, Fujitsu e pochi altri) che supportano nativamente il floating point decimale in hardware.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    Aggiungo che l'utilizzo è pressochè sparito, a parte nicchie varie, giacchè lentezza e complessità, oltre ad utilizzo di memoria, dei BCD sono enormi, rispetto alle rappresentazioni compatte.
    Si tratta di una vestigia del passato, non ancora "sparito" del tutto, ma... quasi.
    Lato x86 le istruzioni per i packed sono praticamente solo somme e sottrazioni, quindi essenzialmente inutili (se devi farti una libreria tanto vale farla bene), mentre per gli unpacked c'è qualcosa in più (AA...), ovvero moltiplicazioni e divisioni.
    Comunque lente.

    Tanto per complicarsi la vita hanno addirittura tentato (parliamo di vestigie "COBOL", cioè supporto per facilitare da hardware certe operazioni software, come oggi si fa con AES e così via, addirittura di processori anni '50 e '60 basati fortemente su rappresentazioni decimali. Sempre a memoria (ma non sono così vecchio!) fu IBM a introdurre i processori con aritmetica "binaria" negli anni '60 o giù di lì, spacciandoli come sistemi ultraavanzati per calcoli missilistici (era NASA) e così via, chiudo inciso perchè francamente non è argomento per me così interessante) di far eseguire calcoli alla FPU Intel, ma con due istruzioni di conversione BCD<->float che in pratica non fanno molto più che "im(s)pacchettare" opportunamente le cifre per (vado a memoria, è roba che non uso da una 20ina di anni) rappresentare una ventina di cifre.

    Sintetizzando: per quanto ne so è ormai (quasi) del tutto abbandonato: i "difetti" sono più dei "pregi"
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    @+m+: attenzione che ti stai sbagliando.

    Il BCD e' FONDAMENTALE nella gestione di quantita' monetarie. L'utilizzo del floating point in tali applicazioni e' fonte inesauribile di rogne rognose, per il fondamentale problema che non puoi rappresentare correttamente valori come 0.33 (33 centesimi).

    Gli arrotondamenti, in questo tipo di applicazioni, non sono tollerabili, ne tollerati.
    Se devono essere fatti, ci sono LEGGI che specificano come deve essere fatto l'arrotondamento o il troncamento.
    E una banca, che tratta milioni o miliardi, e n-mila transazioni al giorno, non puo' permettersi che i conti non tornino per problemi di arrotondamento!

    In generale, infatti, la valuta viene rappresentata con dei valori in fixed point con 5 o 6 cifre decimali. E per fare questo ci sono librerie che usano, appunto, il formato BCD.

    In campo finanziario, avendo a che fare con valuta (soldi, schei, moneta, palanche, ...), le operazioni che ti servono sono praticamente SOLO somme, sottrazioni, moltiplicazioni e divisioni.

    Non ti servono logaritmi o funzioni trigonometriche ... Per quelle ci sono i floating point!
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    migliorabile ha scritto:


    @+m+: attenzione che ti stai sbagliando.

    Il BCD e' FONDAMENTALE nella gestione di quantita' monetarie...
    In realtà le quantità monetarie, nei software "moderni", non vengono gestiti mediante l'implementazione BCD, ma mediante interi scalati (o double scalati), ovvero ad esempio memorizzando 100,33 nell'intero 10033, ed effettuando le divisioni per avere la versione "floating".
    Spesso per la verità si utilizzano, come accennato, i double (con la stessa tecnica)

    "una volta" (ma anche oggi per i vecchi programmi a 32 bit) gli interi a 64 bit (o long long) non erano tanto diffusi, mentre i compilatori moderni (e le CPU) danno supporto per interi così lunghi che puoi avere decine di migliaia di miliardi (con 5 decimali, che per quanto ne so è il limite pratico utilizzato per gli arrotondamenti) direttamente in 8 byte

    Quindi è verissimo che bisogna avere particolari attenzioni nel maneggiare importi monetari, ma NON vengono utilizzati (quasi mai, per quanto ne so. E qualche gestionale l'ho visto... ) a tal fine le codifiche BCD "classiche" (se non forse per qualche buro-software COBOL)

    EDIT: aggiungo che si usano diffusamente, nel caso di memorizzazione ad esempio di euro dentro double, funzioni del tipo euroarrotonda() che fa quello che uno pensa, soprattutto nelle moltiplicazioni (IVA, ritenuta etc), quindi è frequentissimo trovare pezzi di codice del tipo
    
    iva= euroarrotonda(euroarrotonda(imponibile)*euroarrotonda(aliquota))
    

    Aggiungo però un dettaglio: nel caso di utilizzo di campi DECIMAL con numero variabile di cifre è usuale utilizzare strutture più "furbe" di BCD, o dei BCD "superimpaccati", ad esempio mysql memorizza 9 cifre ogni 4 byte.

    In breve: nei programmi che maneggiano dati a precisione fissa (es. 2, 3 o 4 decimali) è usuale utilizzare long long e double scalati; altrimenti ci sono le varie librerie più o meno evolute per memorizzare interi di lunghezza arbitraria, "superimpaccati" e così via.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    +m+ ha scritto:


    migliorabile ha scritto:


    @+m+: attenzione che ti stai sbagliando.

    Il BCD e' FONDAMENTALE nella gestione di quantita' monetarie...
    In realtà le quantità monetarie, nei software "moderni", non vengono gestiti mediante l'implementazione BCD, ma mediante interi scalati (o double scalati), ovvero ad esempio memorizzando 100,33 nell'intero 10033, ed effettuando le divisioni per avere la versione "floating".
    Il problema sta a monte. Puoi assegnare quante cifre vuoi alla mantissa di un floating point binario, ma quando passi da decimale a binario potresti ottenere una mantissa di lunghezza infinita, per cui devi comunque troncarla.

    Su internet trovi parecchi siti dove ciò viene spiegato, compreso questo sito: .

    La cosa più grave è che anche con un numero elevato di bit per la mantissa, l'errore può essere molto grande e difficilmente predicibile. Ad esempio, se al link precedente sottometti 0.1 come valore decimale, in realtà il valore memorizzato in binario è circa 0.16, per cui hai un errore del 60%. Con 1.7, invece, hai un errore molto più piccolo.

    Questo problema si può vedere anche lanciando lo strumento di debug di alcuni IDE (tipo code::blocks) e guardando il valore delle variabili floating point.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    +m+ ha scritto:


    EDIT: aggiungo che si usano diffusamente, nel caso di memorizzazione ad esempio di euro dentro double, funzioni del tipo euroarrotonda() che fa quello che uno pensa, soprattutto nelle moltiplicazioni (IVA, ritenuta etc), quindi è frequentissimo trovare pezzi di codice del tipo
    
    iva= euroarrotonda(euroarrotonda(imponibile)*euroarrotonda(aliquota))
    
    Quello risolve tutto un altro problema, ovvero il fatto che dividendo un numero decimale si possa ottenere un altro decimale con un numero maggiore di cifre dopo la virgola (eventualmente infinito). Tutto ciò rimanendo sempre all'interno della rappresentazione in base dieci.

    Qui invece stiamo parlando di rappresentazione di un numero decimale, a lunghezza finita, in binario.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    I problemi del formato floating point binario IEEE 754 sono eccessivamente numerosi per essere sviscerati in un singolo thread, e fortunatamente sono arcinoti e coperti da una vastissima letteratura, più volte menzionata. D'altro canto, il fixed point (e il rational, da non sottovalutare) si presta a numerose rappresentazioni, binarie come decimali, a precisione arbitraria: sono in genere queste, parimenti coperte dallo standard ANSI/IEEE 854, ad essere usate internamente nelle librerie "monetarie" di ogni foggia e d'ogne età, magari accanto ad altri formati meno diffusi.

    Per fornire un primo orientamento all'OP e ad altri futuri lettori del thread, ricordo nuovamente "What every computer scientist should know about floating-point arithmetic", the floating point guide, e una buona bibliografia di base sul calcolo numerico.

    Nel mainstream i formati BCD tradizionali, coperti da una manciatina di istruzioni x86 per l'aritmetica intera, sono chiaramente in declino, ma non è così in altri settori, dall'embedded al supercalcolo, dove BCD12, BCD20 e loro estensioni IEEE 854 sono ampiamente supportati in hardware e firmware.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    dvaosta ha scritto:


    +m+ ha scritto:


    EDIT: aggiungo che si usano diffusamente, nel caso di memorizzazione ad esempio di euro dentro double, funzioni del tipo euroarrotonda() che fa quello che uno pensa, soprattutto nelle moltiplicazioni (IVA, ritenuta etc), quindi è frequentissimo trovare pezzi di codice del tipo
    
    iva= euroarrotonda(euroarrotonda(imponibile)*euroarrotonda(aliquota))
    
    Quello risolve tutto un altro problema, ovvero il fatto che dividendo un numero decimale si possa ottenere un altro decimale con un numero maggiore di cifre dopo la virgola (eventualmente infinito). Tutto ciò rimanendo sempre all'interno della rappresentazione in base dieci.

    Qui invece stiamo parlando di rappresentazione di un numero decimale, a lunghezza finita, in binario.
    In realtà no, perchè fa due cose
    1) arrotonda secondo le regole euro (cosa che ovviamente CPU e compilatori vari non sanno fare)
    2) trasforma virgola mobile in virgola fissa (o interi lunghi in virgola fissa)

    Tra l'altro (1) non è per nulla banale, dal punto di vista della stabilità numerica, e addirittura per le differenze tra i SO microsoft (!!!! il mitico Vista ha una libreria floating point diversa dagli altri !!!! che viene addirittura chiamata in causa anche quando la FPU c'è - praticamente sempre con i processori moderni)

    La "trafila" classica è quindi (mi riferisco a gestionali e valute)
    - sul DB i dati vengono mantenuti su formati DECIMAL (o quel che si vuole) che sono a virgola fissa impaccati "per bene"
    - quando leggi i dati dal DB tipicamente ti ritrovi dati float (double), che memorizzerai in double a 8 byte, con l'accortezza di scriverti una "buona" funzione di arrotondamento da usare praticamente sempre dove c'è qualcosa di più di somme o sottrazioni
    - li riscriverai sul DB con opportuna conversione nella INSERT (che poi sarà sempre la funzione euroarrotonda)

    cambia un pochino nel caso in cui siano dati con più cifre dopo la virgola, ad esempio movimenti di magazzino di beni che costano pochi millesimi per unità di misura, si usano tipicamente funzioni sempre euroarrotonda ma con parametro (numero di cifre significative dopo la virgola)

    Difficilmente, direi praticamente mai, trovi in un gestionale una variabile definita di tipo BCD per i motivi già spiegati, anche ammesso che il tipo BCD esista nel linguaggio usato.

    Nulla vieta invece di utilizzare classi o strutture ad hoc, ma nella mia esperienza non capita praticamente mai (sempre per gestionali e valute, nelle elaborazioni scientifica invece è spesso il contrario)
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    M.A.W. 1968 ha scritto:


    I problemi del formato floating point binario IEEE 754 sono eccessivamente numerosi per essere sviscerati in un singolo thread, e fortunatamente sono arcinoti e coperti da una vastissima letteratura, più volte menzionata. D'altro canto, il fixed point (e il rational, da non sottovalutare) si presta a numerose rappresentazioni, binarie come decimali, a precisione arbitraria: sono in genere queste, parimenti coperte dallo standard ANSI/IEEE 854, ad essere usate internamente nelle librerie "monetarie" di ogni foggia e d'ogne età, magari accanto ad altri formati meno diffusi.

    Per fornire un primo orientamento all'OP e ad altri futuri lettori del thread, ricordo nuovamente "What every computer scientist should know about floating-point arithmetic", the floating point guide, e una buona bibliografia di base sul calcolo numerico.

    Nel mainstream i formati BCD tradizionali, coperti da una manciatina di istruzioni x86 per l'aritmetica intera, sono chiaramente in declino, ma non è così in altri settori, dall'embedded al supercalcolo, dove BCD12, BCD20 e loro estensioni IEEE 854 sono ampiamente supportati in hardware e firmware.
    La bibliografia citata ammette comunque che alcuni numeri decimali che hanno lunghezza finita in base 10 non possono essere rappresentati correttamente in base 2 usando i floating point, per cui non capisco il punto.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    dvaosta ha scritto:


    Il problema sta a monte...
    Non c'è nessun problema, si chiama "virgola fissa" (vera o simulata, nel senso di implementata su una rappresentazione a virgola mobile), non "virgola mobile".
    E' la primissima cosa che veniva (boh, oggi non so) insegnata a Calcolo numerico (eeee.... bei tempi...).

    Per caso conosci un qualche gestionale, italiano o estero, che utilizzi per i suoi conteggi interni rappresentazioni BCD? Io neppure uno, ma questo non implica che non ne esistano.
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    dvaosta ha scritto:


    La bibliografia citata ammette comunque che alcuni numeri decimali che hanno lunghezza finita in base 10 non possono essere rappresentati correttamente in base 2 usando i floating point, per cui non capisco il punto.
    Non devi trattare numeri con QUALSIASI parte in virgola mobile, bensì con un numero conosciuto, e tipicamente fisso, ovvero 2 (per euro), 3 (normativa opzionale per i calcoli intermedi in euro), 5 (per quello che ne so lo standard per piccole quantità).
    Quindi puoi rappresentare BENISSIMO (cioè senza errori di arrotondamento) un numero decimale in base 10 su un floating point, RIDUCENDO il range di valori utili, e usandoli come se fossero interi, scalando brutalmente la "virgola fissa", l'ho già scritto (si usano normalmente double proprio per il maggior spazio, 8 byte o 14/15 cifre significative)

    Se vuoi rappresentare numeri fino a ~ 10 miliardi di euro ti basta "qualcosa" che abbia 11 cifre significative
    9.999.999.999,99 => 999999999999, proprio un double o un long long 64 bit
    e per 5 cifre decimali => 14
    Se ti servono numeri maggiori => vai di libreria.

    Ovviamente ti servirà "qualcosa" per fare le moltiplicazioni, ecco quindi funzioni euroarrotonda(), o ridefinzione di operatori alla C++ o quello che vuoi (solo zucchero sintattico, non cambia il concetto)
  • Re: Qualcuno mi sa dire precisamente in cosa consiste il sistema BCD (Binary-Coded-Decimal)?

    +m+ ha scritto:


    Ovviamente ti servirà "qualcosa" per fare le moltiplicazioni
    Servirebbe qualcosa per fare moltiplicazioni in base 10, peccato che l'hardware lavori in base 2. quindi se tu hai, ad esempio, 1.7, dovresti riuscire a trasformarlo in 17 prima che venga trasformato in binario. Inoltre, per mostrare di nuovo all'utente 1.7, dovresti ridividere 17 sempre in base 10.
Devi accedere o registrarti per scrivere nel forum
21 risposte