@LanskoyGames
У модераторов первое место, но только с конца...

Почему компьютеры не используют двоично-десятичный формат для вычислений?

Разве не лучше представлять цифры в полубайтах от 0(000) до 9(1001)? В этом случае мы получим нормальную десятичную систему счисления без приближений в таких числах, как 2,1;3,4;45,9 и т.д.. Получим в 2,5 раза меньше памяти, но сейчас, когда даже на телефонах может быть 6 ГБ оперативки это страшно ради точных вычислений?

jcmvbkbc сказал, что это двоично-десятичный формат, но почему его сейчас почти не используют?

Upd:
Многие сказали, а что с числами 1010, 1011 и т.д.. Ну а разве нельзя просто переходить на следующий полубайт после 1001, иначе, если задействовать числа до 15(1111), тогда она будет делить без периодов только на производные чисел 3 и 5(15 состоит из простых чисел 3 и 5). Двоично-десятичная система была же реализована. Кстати, поэтому прекрасно можно заменить 12-ричную систему на 6-ричную, так как в первом случае у нас число состоит из 2; 2; 3 и от одной двойки можно избавиться, тоже самое с 60-ричной и 30-ричной, 9-ричной и троичной.

Я сказал в ≈ 2,5 раза, так как обычным способом в байтах всего можно записать до 255, а в моём случае до 99(1001 1001).

Если поделить 2 на 5(10/101), то мы получим периодическую дробь, так как двоичная система счисления состоит только из одного простого числа: 2. Поэтому только на два можно делить в двоичной системе и не бояться получить период.
  • Вопрос задан
  • 463 просмотра
Решения вопроса 1
hint000
@hint000
у админа три руки
Идея двоично-десятичного представления не нова. Как минимум, 60 лет назад (а вероятно, что и ещё раньше) она имела практическую реализацию, как в аппаратной части (например, на IBM System/360), так и на языке высокого уровня (Cobol, 65 лет назад). https://ru.wikipedia.org/wiki/Двоично-десятичный_код
Поскольку Cobol до сих пор немножко жив (в США есть спрос на опытных программистов на Cobol, в основном в финансовом секторе), то при желании можете его использовать вместе с его реализацией двоично-десятичной арифметики.
Но скорость вычислений может быть меньше на порядок по сравнению с двоичным кодированием.

ради точных вычислений
арифметика с плавающей точкой в принципе не может быть точной. Например, в вашей любимой десятичной системе вы не сможете точно записать 1/3, 1/6, 1/7, 1/9, 1/11, 1/12, 1/13, 1/14, 1/15,.. (вам для этого потребуется бесконечно много разрядов, так же как в двоичной системе для ваших примеров 2,1;3,4;45,9). Проблему можно решить арифметикой с рациональными числами, но это будет ещё на порядок медленнее даже по сравнению с двоично-десятичной арифметикой. Реализации (библиотеки) тоже существуют - можете их найти и использовать, если готовы ради точности потерять в скорости в 100, а то и в 1000 раз (иногда точность на самом деле настолько важна, спору нет, но таких задач мало). Кстати, сравните возможности арифметики рациональных чисел с возможностями длинной арифметики. :) Тут не всё так однозначно.
https://ru.wikipedia.org/wiki/Длинная_арифметика

В целом вопрос хороший в плане вашей любознательности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
AshBlade
@AshBlade
Просто хочу быть счастливым
Во-первых, что значит "без приближений"? Совсем не понял о чем речь.
Во-вторых, процессор работает только с числами - про цифры он ничего не знает (точнее для него есть только 2 цифры - 0 и 1). очень редко надо оперировать именно цифрами
В-третьих, аргумент "в 2,5 раза меньше памяти" - сомнителен. Где меньше?

Дополнительно - то, как процессор работает с числами - это его дело. Программист работает с ЯП, на его уровне абстракции. И знать как там устроены/хранятся битики, чиселки и т.д. - не нужно
Ответ написан
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Потому что на самом низком уровне ячейки памяти могут иметь только два состояния - 0 и 1, есть сигнал и нет сигнала. Это самая простая реализация. Остальные системы счисления и все остальное, что сверху - это абстракции для людей. Вот поэтому и используются двоичная система счисления. Да, можно написать эмулятор системы с любой битностью - но это стоит ресурсов. С точностью тоже проблем никаких нет: кроме чисел с плавающей точкой есть еще и целые числа - любая нужная точность достигается без проблем. Просто для этого нужны дополнительные ресурсы в виде вычислений/памяти. Есть куча математических библиотек и прочее. Так же, ничего не мешает делать вычислительные системы с основой на любой битности. Это лишь вопрос трудозатрат/финансов и совместимости со всем остальным современным ПО. В СССР был успешный проект трехбитной ЭВМ Сетунь - она успешно решала поставленные задачи. Очень интересный и перспективный проект - жаль, что не получил развития.
Ответ написан
@Everything_is_bad
Ты что-то себе напридумывал "про нормальную десятичную систему" и "меньше памяти". А чё делать с 1010 и прочими?
Ответ написан
Комментировать
@alexalexes
А чего в вашей системе этот диапазон пустует 1010...1111?
систему счисления без приближений в таких числах, как 2,1;3,4;45,9

Сдвинте на разряд вперед, и считайте в целых. После подсчета поставьте в нужном месте разделитель.
6 ГБ оперативки это страшно ради точных вычислений

Для быстродействующих низкоуровневых вычислительных устройств, разработчики компиляторов, как правило, стараются сделать так, чтобы не сталкиваться с математикой вещественных чисел, так как на аппаратном уровне регистры ограничены по точности для этих вычислений. Если есть возможность сдвигать и переводить в целые - этим и пользуются.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Разве не лучше представлять цифры в полубайтах от 1(0001) до 9(1001)?

Компьютер вообще представляет цифры в виде 0 и 1 (есть сигнал и нет сигнала).
Объединение в байты это уже архитектура. И следовательно в данном случае, если говорить про 4 бита, то это будет от 0000 до 1111, а не как ты себе придумал.

Во-вторых, если ты уменьшаешь размер ячейки, нужно понимать, что оперировать адресами памяти станет сложнее.
Надо тебе считать ячейку по адресу 4 gb, сколько четырехбитных "байт" тебе на это понадобится? вдвое больше. В результате твоя экономия наоборот окажется падением и в производительности и в размерах.
Банально нужно написать текст, для чего требуется хотя бы два алфавита (маленькие, большие буквы), цифры, знаки препинания - влезет это все в твои 4 бита? нет.

Уточняй что именно ты хотел спросить и почитай базу что такое архитектура и как работает процессор.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему компьютеры не используют четырехбитный формат для вычислений?
Разве не лучше представлять цифры в полубайтах от 1(0001) до 9(1001)?

Используют, двоично-десятичный код это называется. В процессорных архитектурах из прошлого века есть даже специальные процессорные инструкции для работы с числами записанными в таком формате. Но это действительно атавизм.

мы получим нормальную десятичную систему счисления без приближений в таких числах, как 2,1;3,4;45,9 и т.д.

Когда нужна точная арифметика с фиксированным количеством знаков после запятой обычно используют целые числа, так что проблем с этим нет ни в десятичной ни в двоичной системе.
С другой стороны никакая система счисления не может представить в конечном виде дроби, в знаменателе которых есть множители, не входящие в основание этой системы счисления. Почему бы тогда не использовать 12-ричную (тоже, кстати, цифра влезет в 4 бита) или 60-ричную систему, только из-за привычности десятичной?
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
BCD использовалась для старых ЭВМ (16 бит) в тех случаях когда нужно было делать
финансовые расчеты.

Могу предположить, что для финансовой арифметики, возможности современных
CPU в части SSE/AVX перекрыли все подобные задачи. И работают они быстрее чем BCD.

В целом, эта (BCD) арифметика сегодня живет в бухгалтерских калькуляторах типа Sharp/Citizen.

Погрешности при делении AVX512 и BCD можно обсудить отдельно, но это нужно иметь какие-то
требования. Чтоб не просто так с потолка сравнивать.
Ответ написан
Комментировать
@vadimr
Двоично-десятичную систему иногда используют в коммерческих приложениях, где важно точное десятичное представление чисел.

Нигде больше десятичная система, как таковая, нафиг не сдалась. Мы в подавляющем большинстве задач работаем со значениями чисел, а не с их визуальным представлением в какой-либо системе счисления. Давно вы выписывали цифры из компьютерной программы? Нам обычно важно совершить какие-то действия в зависимости от результатов вычислений, а это никак не привязано к системе счисления.

А поэтому используют то представление чисел, которое требует меньше электрических сигналов и поэтому обеспечивает более быструю работу компьютера, то есть двоичное.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы