Класс с фиксированной точкой

ОГЛАВЛЕНИЕ

Шаблон класса C++ для математики с фиксированной точкой.

Введение

Было решено начать работу над многократно используемым классом для математики с фиксированной точкой. Другой побуждающей причиной было желание узнать, действительно ли на 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, который будет содержать тестовые проекты.