Hoy en día, es común almacenar números en formato binario y convertirlos a formato decimal para fines de visualización, pero la conversión lleva algo de tiempo. Si el objetivo principal de un número se muestra o se agrega a un número que se mostrará, puede ser más práctico realizar cálculos en formato decimal que realizar cálculos en binario y convertir a decimal. Muchos dispositivos con lecturas numéricas y muchos videojuegos almacenan números en formato BCD empaquetado, que almacena dos dígitos por byte. Esta es la razón por la que muchos contadores de puntaje se desbordan en 1,000,000 puntos en lugar de algún valor de potencia de dos. Si el hardware no facilita la aritmética BCD empaquetada, la alternativa no sería usar binario, sino usar decimal sin empaquetar. La conversión de BCD empaquetado a decimal desempacado en el momento en que se muestra puede hacerse fácilmente un dígito a la vez. Por el contrario, la conversión de binario a decimal es mucho más lenta y requiere operar en toda la cantidad.
Por cierto, el conjunto de instrucciones 8086 es el único que he visto con instrucciones para "Ajuste ASCII para División" y "Ajuste ASCII para Multiplicación", uno de los cuales multiplica un byte por diez y el otro por diez. Curiosamente, el valor "0A" es parte de las instrucciones de la máquina, y sustituirlo por otras hará que esas instrucciones se multipliquen o dividan por otras cantidades, pero las instrucciones no están documentadas como instrucciones de uso general de multiplicar/dividir por constante . Me pregunto por qué esa característica no fue documentada, dado que podría haber sido útil.
También es interesante observar la variedad de enfoques de los procesadores utilizados para sumar o restar BCD empaquetados. Muchos realizan una adición binaria, pero utilizan una bandera para realizar un seguimiento de si se produjo un acarreo del bit 3 al bit 4 durante una adición; entonces pueden esperar que el código limpie el resultado (por ejemplo, PIC), proporcionen un código de operación para la adición de la limpieza pero no la resta, suministren un código de operación para limpiar la suma y otro para la resta (por ejemplo, x86) o utilicen una bandera para rastrear si la última la operación fue suma o resta y utiliza el mismo código de operación para limpiar ambos (por ejemplo, Z80). Algunos usan códigos de operación separados para la aritmética de BCD (por ejemplo, 68000), y algunos usan un indicador para indicar si las operaciones de adición/sustracción deben usar binario o BCD (por ejemplo, derivadas de 6502). Curiosamente, el original 6502 realiza cálculos BCD a la misma velocidad que las matemáticas binarias, pero los derivados CMOS de este requieren un ciclo extra para las operaciones BCD.
"mejores alternativas"? Construiría un tipo 'BigDecimal' de C++ en el BCD del hardware; seguramente sería rápido si lo hicieras de esa manera. No estoy seguro de qué sería "mejor" que usar el tipo de datos de hardware. –
Dudo que las CPU x86 modernas tengan implementaciones optimizadas de BCD; probablemente se hayan implementado como microcódigo con un enfoque en la compatibilidad, no en el rendimiento. – Michael
IBM tiene soporte de hardware para DECFLOAT en sus CPU POWER 6. –