Реализация 8-битной фиксированной точки без знака с умножением и фиксированием - PullRequest
0 голосов
/ 01 ноября 2019

Я хотел бы представить числа в диапазоне [0.0, 1.0] (оптимально, включая обе конечные точки), используя 8-битные слова.

Я хотел бы иметь возможность эффективно умножать их и добавлять /вычитание должно быть оптимально ограничено [0,1], а не переполнением.

Например, если 0xFF будет представлять 1,0, а 0x00 будет представлять 0,0, то умножение должно дать, например,

0x3F (0,247) = 0x7F (0,499) * 0x7F (0,499)

Я нашел https://courses.cs.washington.edu/courses/cse467/08au/labs/l5/fp.pdf, и я думаю, что то, что в документе будет называться U (0,8), соответствует тому, что я ищу,но я не понимаю, как, например, нужно было бы реализовать умножение.

Существует ли библиотека c ++, которая эффективно реализует такой тип данных, или кто-то может указать мне на необходимую математику?

Мне не нужно деление, только умножение, сложение и вычитание

1 Ответ

1 голос
/ 02 ноября 2019

Выбранный вами формат с фиксированной точкой, U [0.8], не включает в себя точное значение конечной точки 1. Максимальное значение в этом формате на самом деле составляет 0,99609375. Если это достаточно близко для вас, мы можем поговорить о выполнении математики.

Умножение двух значений U [0,8] дает 16-битный результат в формате U [0,16]. Чтобы преобразовать обратно в U [0,8], вы должны сдвинуть вправо на 8 битных позиций. Таким образом, умножение 0x7F на 0x7F дает 0x3F01. Сдвиг вправо на 8 бит дает результат U [0,8] 0x3F, если необходимо.

Два значения в формате U [0,8] могут быть добавлены или вычтены с помощью обычных целочисленных операций. Однако вы должны либо предотвратить переполнение / недостаточное заполнение, либо обнаружить переполнение / недостаточное заполнение в результате. Кроме того, чтобы обнаружить переполнение, вы можете обнулить оба значения до 16 бит, выполнить сложение и проверить, больше ли результат, чем 0xFF. Если это так, вы можете насыщать и возвращать 0xFF.

Для вычитания вы можете сравнить значения перед выполнением вычитания, и если результат будет отрицательным, просто верните ноль.

...