Mail.ruПочта0Мой Мир0ОдноклассникиВКонтактеИгры0ЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Десятичные дроби в программировании

2 2 Ученик (167), закрыт 9 месяцев назад
Я плохо разбираюсь в низкоуровневом программировании, но я хочу задать этот вопрос. Вот ведь на Python или других языках программирования 0.1 + 0.2 = 3.000...004 (также с умножением и т.д.). Почему десятичные дроби в программировании не записывают так: каждый символ числа (цифры, точка для десятичных дробей) в 2 байта (16 бит), кол-во битов с единицей в значении значит какое число (только первые 10 битов из 2-х байтов) например только первый бит - единица, только два первых - двойка и так до 9-тки, если все 10, то 0, а если все 16 битов, то это точка. А кол-во символов в числе, записывается в BigInt переменную (как в Java или JavaScript). Для примера я напишу число 6703.42109 (одна строка - один символ; 1-ый байт, пробел, 2-ой пробел; в скобочках буду писать значение этих байтов):
11111100 00000000 (6)
11111110 00000000 (7)
0000000 00000000 (0)
1110000 00000000 (3)
11111111 11111111 (.)
1111000 00000000 (4)
11000000 00000000 (2)
10000000 00000000 (1)
00000000 00000000 (0)
11111111 10000000 (9)
Дополнен 9 месяцев назад
Я хочу спросить, что почему никто не догадался до этой системы, ведь явно кто-то догадывался, но наверняка эту систему невозможно использовать, или возможно. Как бы это ни было, пожалуйста объясните мне это.
Лучший ответ
Андрей Высший разум (480417) 9 месяцев назад
В те далёкие времена, когда вычислительные машины были большими и медленными, компьютеры, предназначенные для финансовых расчётов поддерживали аппаратную реализацию специального формата дробных чисел: двоично-десятичные числа, предназначенные для точных вычислений с десятичными дробями. В них для записи десятичных цифр, знака числа и точки использовалось по 4 бита на символ. Т.е. в 1 байт записывалось 2 символа числа.

Но по мере роста производительности компьютеров и увеличения длины аппартно поддерживаемых целых чисел надобность в отдельном аппаратном типе чисел для финансовых расчётов пропала.

А для тех редких случаев, когда требуются точные вычисления рациональных чисел, практически все современные языки программирования содержат специальные модули, программно реализующие как десятичные вычисления с фиксированной точкой, так и вычисления с дробными (числитель / знаменатель) числами.
Остальные ответы
Вꙵсⷭеⷧмⷶ ⷨвеⷯдꙷоⷷмⷮоⷶ Гуру (2972) 9 месяцев назад
13993921488116182920110911
2 2Ученик (167) 9 месяцев назад
Что?
2 2, это просто один из тысяч тупых флудеров, которые тут бегают и пишут рандомный набор символов в надежде срубить 1-2 балла. Их легко узнать по 2% КПД.
nds Просветленный (26224) 9 месяцев назад
Это особенность реализации чисел с плавающей точкой и от языка не зависит, а только от оборудования.
Они были так задуманы для быстрой обработки при недостатке оперативной памяти.
Сейчас возможно было бы разумно перейти на числа с фиксированной точкой но обратная совместимость не пускает.
2 2Ученик (167) 9 месяцев назад
а почему не сделали как у меня, я ведь не один явно придумал данный вид реализации
ndsПросветленный (26224) 9 месяцев назад
Потому что когда придумывали память была сверх дорогой
Celtic Hammer Мудрец (17708) 9 месяцев назад
Это во всех языках так. Число 0.3 в двоичной системе невозможно представить абсолютно точно, вот и получается такой диковинный результат
2 2Ученик (167) 9 месяцев назад
так почему её не записывают вот так, ведь в этой системе её можно представить, почему никто не догадался её использовать, или невозможно мою систему использовать
Похожие вопросы