Число с фиксированной запятой представляет собой представление действительного числа с использованием определенного числа битов типа для целочисленной части и оставшихся битов типа для дробной части. Количество битов, представляющих каждую часть, является фиксированным (отсюда и название, с фиксированной точкой). Целочисленный тип обычно используется для хранения значений с фиксированной точкой.
Числа с фиксированной запятой обычно используются в системах, которые не имеют поддержки с плавающей запятой или нуждаются в большей скорости, чем может обеспечить с плавающей запятой. Расчеты с фиксированной точкой могут выполняться с использованием целочисленных инструкций ЦП.
32-разрядное число с фиксированной запятой будет сохранено в 32-разрядном типе, таком как int
.
Обычно каждый бит в целочисленном типе (в данном случае без знака) представляет целое значение 2 ^ n следующим образом:
1 0 1 1 0 0 1 0 = 2^7 + 2^5 + 2^4 + 2^1 = 178
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
Но если тип используется для хранения значения с фиксированной запятой, биты интерпретируются немного по-другому:
1 0 1 1 0 0 1 0 = 2^3 + 2^1 + 2^0 + 2^-3 = 11.125
2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4
Номер с фиксированной точкой в приведенном выше примере называется номером с фиксированной точкой 4,4, поскольку в целочисленной части 4 бита, а в дробной части 4 бита. В 32-битном типе значение с фиксированной точкой обычно будет в формате 16.16, но также может быть 24,8, 28,4 или любой другой комбинацией.
Преобразование из значения с плавающей запятой в значение с фиксированной запятой включает в себя следующие шаги:
- Умножить число с плавающей запятой на 2 ^ (количество дробных бит для типа), например. 2 ^ 8 для 24,8
- Округлите результат (просто добавьте 0,5), если необходимо, и напишите его (или приведите к целочисленному типу), оставив целочисленное значение.
- Присвойте это значение типу с фиксированной запятой.
Очевидно, что вы можете потерять некоторую точность в дробной части числа. Если важна точность дробной части, это может отражать выбор формата с фиксированной запятой - например, используйте 16,16 или 8,24 вместо 24,8.
Отрицательные значения также можно обрабатывать аналогичным образом, если необходимо подписать номер с фиксированной точкой.
Если бы мой Java был сильнее, я бы попробовал какой-то код, но я обычно пишу такие вещи на C, поэтому я не буду пытаться использовать Java-версию. Кроме того, версия stacker выглядит хорошо для меня, за небольшим исключением, что она не предлагает возможности округления. Он даже показывает, как выполнить умножение (сдвиг важен!)