Деление чисел с плавающей запятой происходит быстрее, чем целочисленное деление из-за экспоненты в представлении чисел с плавающей запятой . Для деления одного показателя на другой используется одно простое вычитание.
int32_t
деление требует быстрого деления 31-битных чисел, тогда как float
деление требует быстрого деления 24-битных мантисс (подразумевается ведущий в мантиссе и не сохраняется в числе с плавающей запятой) и более быстрое вычитание 8-битные показатели.
См. превосходное подробное объяснение того, как выполняется деление в CPU .
Возможно, стоит упомянуть, что инструкции SSE и AVX обеспечивают только деление с плавающей запятой, но не целочисленное деление. Инструкции SSE / intrinsincs могут быть использованы для увеличения скорости вашего float
вычисления в четыре раза.
Если вы посмотрите на таблицы команд Agner Fog , например, для Skylake, задержка 32-разрядного целочисленного деления составляет 26 циклов ЦП, тогда как задержка скалярного деления с плавающей запятой SSE равна 11 CPU. циклов (и, что удивительно, для разделения четырех упакованных поплавков требуется одинаковое время).
Также обратите внимание, что в C и C ++ нет деления на числа короче, чем int
, так что uint8_t
и uint16_t
сначала переводятся в int
, а затем происходит деление int
s. uint8_t
деление выглядит быстрее, чем int
, поскольку при преобразовании в int
устанавливается меньше битов, что приводит к более быстрому завершению деления.