Что лучше?
В большинстве языков программирования арифметика с фиксированной запятой не реализована ввиду ее главного недостатка — узкого диапазона значений. При работе с таким форматом существует угроза переполнения целочисленной части и потери точности в дробной. Для сравнения, если требуется обеспечить точность в три знака после запятой, то 4-байтовая переменная с фиксированной запятой обеспечивает диапазон всего в 6 порядков, а та же переменная, но в формате с плавающей запятой, — 70 порядков. При этом нужно понимать, что используя фиксированную запятую вместо плавающей, можно значительно ускорить работу некоторых алгоритмов.
Специализированные процессоры для обработки цифровых сигналов обычно включают в себя модуль FPU (с англ. Floating-point Unit), имеющий специальные инструкции для работы с вещественными числами (загрузка, выгрузка в и из регистров, математические операции). Однако такой модуль в микроконтроллерах общего назначения, как правило, отсутствует. Производительная линейка Cortex-M4/M7 (STM32F4/STM32F7) от компании ST Microelectronics включает в себя их поддержку.
Помимо программных ошибок, ошибки могут быть допущены на уровне железа. В процессорах Pentium компании Intel, представленных в 1994 году, модуль FPU работал некорректно и в некоторых случаях выдавал неправильное значение при использовании инструкции
FDIV
. После скандала компании пришлось отозвать партию, что стоило порядка 475 млн. долларов.
По этой причине операций с вещественными числами стараются избегать, заменяя их на поиск по таблице (англ. lookup table) с заранее рассчитанными значениями. Мы рассмотрим такой способ позже.
В вычислительной технике одной из основных единиц измерения быстродействия является FLOPS (от англ. floating-point operations per second), т.е. количество операций с плавающей запятой в секунду. Другие меры производительности — MIPS (от англ. millions instructions per second, не путать с названием архитектуры) и DMIPS.