В настоящее время принято хранить номера в двоичном формате и преобразовывать их в десятичный формат для отображения, но преобразование занимает некоторое время. Если первичная цель числа должна отображаться или быть добавлена к числу, которое будет отображаться, может быть более практичным выполнять вычисления в десятичном формате, чем выполнять вычисления в двоичном формате и преобразовывать их в десятичные. Многие устройства с числовыми показаниями и множество видеоигр хранят номера в упакованном формате BCD, который хранит две цифры на каждый байт. Вот почему многие счетчики счетчиков переполняются на 1,000,000 пунктов, а не на некоторую ценность в два раза. Если аппаратное обеспечение не облегчило арифметику упакованных BCD, альтернативой было бы не использование двоичного кода, а использование распакованного десятичного числа. Преобразование упакованного BCD в распакованный десятичный знак в тот момент, когда оно отображается, легко может быть сделано цифрой за раз. Преобразование двоичного в десятичное, наоборот, происходит гораздо медленнее и требует работы по всему количеству.
Кстати, набор инструкций 8086 является единственным, что я видел с инструкциями для «ASCII Adjust for Division» и «ASCII Adjust for Multiplication», один из которых умножает байт на десять, а другой делится на 10. Любопытно, что значение «0A» является частью машинных инструкций, и замена другого номера приведет к тому, что эти команды будут умножаться или делить на другие величины, но инструкции не документируются как инструкции умножения/разделения по постоянному назначению общего назначения , Интересно, почему эта функция не была задокументирована, учитывая, что она может быть полезной?
Также интересно отметить разнообразие подходов к процессорам, используемым для добавления или вычитания упакованного BCD. Многие выполняют двоичное добавление, но используют флаг, чтобы отслеживать, произошел ли перенос от бит 3 до бит 4 во время добавления; они могут затем ожидать, что код очистит результат (например, PIC), предоставит код операции для очистки, но не вычитает, поставьте один код операции для очистки и другой для вычитания (например, x86) или используйте флаг для отслеживания последнего операция была сложение или вычитание и использование одного и того же кода операции для очистки обоих (например, Z80). Некоторые используют отдельные коды операций для арифметики BCD (например, 68000), а некоторые используют флаг, указывающий, должны ли операции добавления/вычитания использовать двоичный или двоичный код (например, производные от 6502). Интересно, что оригинал 6502 выполняет математику BCD с той же скоростью, что и бинарная математика, но ее производные от CMOS требуют дополнительного цикла для операций BCD.
"лучшие альтернативы"? Я бы построил тип C++ 'BigDecimal' на BCD оборудования - он был бы уверен, если бы вы сделали это именно так. Я не уверен, что было бы «лучше», чем использование аппаратного типа данных. –
Я сомневаюсь, что современные процессоры x86 оптимизировали реализацию BCD - они, вероятно, реализованы в виде микрокода с акцентом на совместимость, а не на производительность. – Michael
IBM имеет аппаратную поддержку DECFLOAT в своих процессорах POWER 6. –