Класс с фиксированной точкой
ОГЛАВЛЕНИЕ
Введение
Было решено начать работу над многократно используемым классом для математики с фиксированной точкой. Другой побуждающей причиной было желание узнать, действительно ли на C++ можно написать класс, объекты которого будут вести себя аналогично встроенным числовым типам. Были поставлены цели, что этот класс с фиксированной точкой:
- должен быть пригоден к использованию в качестве вставной замены для существующих типов с плавающей точкой,
- должен быть быстрее, чем эмуляция плавающей точки на аппаратном обеспечении, не поддерживающем плавающую точку,
- должен быть в общем пригодным к использованию во многих обстоятельствах,
- должен быть красивым по сути, безупречно написанным, и документированным для последующих ссылок.
После краткого введения в математику с фиксированной точкой в статье объясняется, как использовать класс fixed_point. Затем разъясняется реализация класса.
Краткое введение в математику с фиксированной точкой
Число с фиксированной точкой можно разделить на необязательный знаковый разряд, целое и дробную часть.
Целая часть состоит из i битов, дробная часть состоит из f битов.
Суммарное значение числа с фиксированной точкой V равняется:
Число с фиксированной точкой имеет формат i.f.
Диапазон беззнаковых чисел с фиксированной точкой - от 0 до 2^i-1. Диапазон чисел с фиксированной точкой со знаком - от -2^i до 2^i-1. Точность числа с фиксированной точкой равняется 2^(-f).
Пример: предположим, что есть число с фиксированной точкой в 16 битов, в формате 7.8, с дополнительным знаковым битом, при этом биты установлены в 0000 0110 1010 0000 (то есть, 0x06A0 в шестнадцатеричной системе). Значение этого числа с фиксированной точкой +6.625.
Если имеется такой набор битов, независимо от формата числа с фиксированной точкой, с ним можно обращаться как с целым и выполнять над ним действия целочисленной математики. Небольшие сложности возникают только при выполнении умножения или деления: необходимо убедиться, что десятичная точка находится в правильной позиции. Это приблизительно сопоставимо с тем, как вы учились умножать вручную в школе: в конце умножения вы должны были сосчитать разряды после десятичной точки и затем поставить десятичную точку в правильное место.
Следствие для компьютера в том, что быстрые целочисленные команды могут использоваться для выполнения вычислений. Недостаток в том, что диапазон и точность чисел с фиксированной точкой обычно меньше, чем у чисел с плавающей точкой.
Установка проекта
Если вы просто хотите использовать класс fixed_point в своем коде, то вам всего лишь нужно скачать проект. Вы найдете fixed_point.h в папке include/fpml.
Но проект также содержит тестовый код, включая тестирование модулей и контрольные задачи. Для их выполнения вам также потребуется CMake (версия 2.6 или выше), который можно скачать с сайта http://www.cmake.org/. Запустите CMake и укажите в нем каталог, в котором вы сохранили загруженный проект, и используйте его для создания решений и проектов Visual Studio. Затем вы можете загрузить FPMATH.sln, который будет содержать тестовые проекты.