Я использую графическую программу в реальном времени, которая предлагает следующие «форматы пикселей».
Я понимаю многие из них, но одну вещь я не понимаю, это разницу между float
и fixed
.
Зачем кому-то использовать одно вместо другого? Они оба занимают одинаковое количество места, поэтому я не вижу, как можно было бы обеспечить большую точность.
Итак, в основном, «плавающий» означает, что он хранит мантиссу и базовую экспоненту. «Стандартное» 32-битное число с плавающей запятой использует 1 бит для знака, 8 бит для экспоненты и 23 бита для мантиссы. Ключевым моментом здесь является то, что шкала (показатель степени) сохраняется вместе с числом.
«Фиксированный» хранится в «упакованном» старшем/младшем слове. 32-битная фиксированная точка, вероятно , будет 16-битным целым числом до системы счисления и 16-битным целым числом после (десятичная часть). Это не согласуется с комментарием @elegent о диапазоне от 0 до 1: эта ссылка может быть специфичной для реализации, я не знаю. Мне кажется, что эта реализация использует все 32 бита для десятичной части, а затем полагается на контекст для масштаба (экспонента) или что они используют цветовую модель (вероятно), которая использует тот же диапазон.
Что касается точности: количество доступных битов само по себе не означает более высокую точность, но я совершенно не имею права говорить о различиях, помимо очевидных проблем с переполнением/недополнением.
https://stackoverflow.com/questions/8638792/how-to-convert-packed-integer-16-16-fixed-point-to-float
В контексте вашего экранного меню: они используют фиксированный как синоним целого числа: 8-битный фиксированный (rgba) означает 8 бит на пиксель, где каждый байт представляет целочисленное значение от 0 до 255.
Давайте не будем усложнять, подумав о монохромном изображении.
Чтобы представить наше изображение, мы разрезаем его на сетку пикселей и записываем число, представляющее интенсивность света в каждом пикселе. Для простоты давайте предположим, что значение линейно представляет количество света (на самом деле это немного сложнее, но пока достаточно близко).
Однако нам все еще нужно представить это число в виде битового шаблона. Существует бесконечное число возможных значений интенсивности света, но только конечное число возможных битовых комбинаций заданного размера. Очевидно, мы должны пойти на компромисс.
В основном есть две стратегии представления чисел на компьютерах: с фиксированной запятой и с плавающей запятой (целые числа можно считать частным случаем фиксированной запятой). Существует также вопрос подписанных стихов без подписи.
В числе с фиксированной точкой мы заранее фиксируем масштабный коэффициент. Так, например, для представления чисел в диапазоне от 0 до 1 включительно мы можем использовать 32-битное число без знака с масштабным коэффициентом 1/(2 32 -1).
В числе с плавающей запятой мы позволяем выбирать диапазон коэффициентов масштабирования. Мы делаем это, разделяя наши биты. Некоторые биты используются для хранения двоичного числа, а другие биты используются для хранения того, на какую степень двойки следует масштабировать это двоичное число (на практике есть некоторые дополнительные хитрости, прочтите IEEE 754, если вы действительно хотите кровавых подробностей). С числами с плавающей запятой мы можем хранить очень широкий диапазон чисел, но точность зависит от значения числа.
При работе с камерой, экраном или принтером наше оборудование определяет самые темные и самые светлые возможные значения и обычно разбивает возможные значения между ними примерно равным образом. Отрицательные значения на самом деле не имеют никакого физического смысла, поскольку отрицательного света не существует.
С другой стороны, когда мы попадаем в мир 3D-моделирования, может быть полезно представить гораздо более широкий диапазон значений яркости. Между самыми яркими и самыми темными частями мира может быть огромная разница в яркости, и хотя отрицательного света физически не существует, это не означает, что вы не можете использовать его в 3D-модели. Таким образом, форматы, использующие числа с плавающей запятой со знаком, могут начать обретать смысл.
Конечно, есть цена, чтобы заплатить. 32-разрядное число с плавающей запятой со знаком может представлять гораздо большие и гораздо меньшие значения, чем 32-разрядное число с фиксированной запятой без знака, но в некоторых случаях оно будет иметь более низкую точность.
элегантный