Классическая архитектура x86 использует модуль с плавающей точкой (FPU) для выполнения вычислений с плавающей точкой. FPU выполняет все вычисления в своих внутренних регистрах, каждый из которых имеет точность 80 бит. Каждый раз, когда вы пытаетесь работать с float
или double
, переменная сначала загружается из памяти во внутренний регистр FPU. Это означает, что нет абсолютно никакой разницы в скорости реальных вычислений, так как в любом случае вычисления выполняются с полной 80-битной точностью. Единственное, что может отличаться, это скорость загрузки значения из памяти и сохранения результата обратно в память. Естественно, на 32-битной платформе загрузка или сохранение double
может занять больше времени по сравнению с float
. На 64-битной платформе не должно быть никакой разницы.
Современные архитектуры x86 поддерживают расширенные наборы команд (SSE / SSE2) с новыми инструкциями, которые могут выполнять те же вычисления с плавающей запятой без использования «старых» инструкций FPU. Однако, опять же, я не ожидал бы увидеть разницу в скорости вычислений для float
и double
. И поскольку эти современные платформы являются 64-битными, скорость загрузки / сохранения данных также должна быть одинаковой.
На другой аппаратной платформе ситуация может быть иной. Но обычно меньший тип с плавающей точкой не должен давать никаких преимуществ в производительности. Основное назначение меньших типов с плавающей точкой - экономить память, а не повышать производительность.
Редактировать: (по адресу @MSalters comment)
То, что я сказал выше, относится к фундаментальным арифметическим операциям. Когда дело доходит до библиотечных функций, ответ будет зависеть от нескольких деталей реализации. Если набор инструкций платформы с плавающей запятой содержит инструкцию, которая реализует функциональные возможности данной библиотечной функции, то то, что я сказал выше, будет обычно применяться и к этой функции (которая обычно включает такие функции, как sin
, cos
, sqrt
). Для других функций, чьи функциональные возможности не поддерживаются сразу в наборе инструкций FP, ситуация может оказаться существенно другой. Вполне возможно, что float
версии таких функций могут быть реализованы более эффективно, чем их double
версии.