Общее программирование: десятичные числа, поплавки

StackOverflow https://stackoverflow.com/questions/1285908

  •  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. Анкет Но ты получил идею.

Другие советы

Это называется "Арифметика с фиксированной точкой" Люди делают это все время.

Видеть http://gameprogrammer.com/4-fixed.html

Есть довольно много реализаций арифметики с фиксированной точкой. Тем не менее, у нас часто заканчиваются десятичные места очень, очень быстро с хранением с фиксированной точкой. Это идеально подходит для денежных транзакций, где мы знаем, что мы не будем хранить/заботиться о каких -либо иррациональных числах.

Кроме того, для многих других вещей арифметика с фиксированной точкой просто не стоит. Плавание намного быстрее.

Что нужно читать:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top