Общее программирование: десятичные числа, поплавки
-
18-09-2019 - |
Вопрос
Я, вероятно, совершенно неправ, и я ничего не знаю об этом, но у меня есть вопрос о типах данных десятичных чисел в языках программирования. Я понимаю, что поплавки не совсем точные, потому что они хранятся в бинарном языке с силой или чем -то еще, но я всегда задавался вопросом, почему типы данных десятичного числа не просто хранят число, как если бы не было десятичных знаков, так и вычисления как вычисления как Если там не было десятичного, а затем добавьте его после. Как в этой ситуации:
2.159 * 3.507 --> 2159 * 3507 = 7571613
^^^ ^^^
123 456
6 decimals in total... 7571613 -> 7.571613
^^^^^^
654321
Итак, 2.159 * 3.507 = 7,571613
Почему это не может работать так?
Решение
Это именно то, что они делают. Номер с плавающей запятой хранится в форме показателя. Давайте предположим, что мы работаем на актуальном компьютере, поэтому мне не нужно менять все эти цифры на двоичный.
Вы размножаетесь 2.159 * 3.507
, но на самом деле 2.159
хранится как 2159 * 10^-3
а также 3.507
хранится как 3507 * 10^-3
. Анкет Поскольку мы работаем над десятичной системой, 10
предполагается, поэтому нам действительно нужно хранить -3
без 10
, как это: 2159,-3
или же 3507,-3
. Анкет А -3
Расположение «плавающей запятой»: по мере того, как точка перемещается, покинув, уменьшается плавающая точка, уменьшается (.3507
хранится как 3507,-4
) и по мере того, как точка перемещается вправо, плавающая точка увеличивается (увеличивается (35.07
хранится как 3507,-2
).
Когда вы умножаете их вместе, десятичное число (или двоичное число на двоичном компьютере) - единственное, что умножается. Плавающая точка добавляется! Итак, за кулисами, что происходит:
2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6
7571613,-6
просто 7571613 * 10^-6
(Помните, мы можем предположить 10
Потому что мы работаем на десятичном компьютере), который такой же, как 7.571613
.
Конечно, плавающая точка не должна быть -3
, это может быть все, что вписывается в хранилище:
21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613
И, конечно же, большинство компьютеров не хранят вещи в десятичных значениях, поэтому фактические цифры были бы в двоичном 2^-9 -> -9
скорее, чем 10^-3 -> -3
. Анкет Но ты получил идею.
Другие советы
Это называется "Арифметика с фиксированной точкой" Люди делают это все время.
Есть довольно много реализаций арифметики с фиксированной точкой. Тем не менее, у нас часто заканчиваются десятичные места очень, очень быстро с хранением с фиксированной точкой. Это идеально подходит для денежных транзакций, где мы знаем, что мы не будем хранить/заботиться о каких -либо иррациональных числах.
Кроме того, для многих других вещей арифметика с фиксированной точкой просто не стоит. Плавание намного быстрее.
Что нужно читать: