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