Double или float - процедуры оптимизации - PullRequest
7 голосов
/ 15 марта 2012

Я читаю код для процедур оптимизации (Nelder Mead, SQP ...).Языки: C ++, Python.Я заметил, что часто выполняется преобразование из double в float, или методы дублируются с двойным соотв.плавающие аргументы.Почему это выгодно в коде процедур оптимизации, и это важно?В моем собственном коде на C ++ я должен быть осторожен с типами double и float и почему?

С уважением.

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Часто выбор между double и float делается больше из-за требований пространства, чем скорости.Современные процессоры способны работать на double довольно быстро.

Плавающие могут быть быстрее, чем удваиваются при использовании SIMD-инструкций (таких как SSE), которые могут работать с несколькими значениями одновременно.Также, если операции выполняются быстрее, чем конвейер памяти, меньшие требования к памяти float в целом ускорят процесс.

2 голосов
/ 18 марта 2012

В некоторых алгоритмах оптимизации выбор между double и float равен , а не , что больше зависит от места, чем от скорости.Например, с методами штрафа или барьера, которые используются для методов внутренней точки в нелинейной оптимизации, a float имеет недостаточную точность по сравнению с double, а использование float s в алгоритме приведет к мусору.По этой причине методы штрафов и барьеров не использовались в 1960-х годах, но были открыты позже с появлением типа данных двойной точности.(Подробнее об этих методах см. Нелинейное программирование: методы последовательной неограниченной минимизации (Классика в прикладной математике) , автор Fiacco и McCormick.)

Еще одним соображением является обусловленность лежащих в основе линейных систем, решаемыхво многих алгоритмах оптимизации.Если линейные системы, которые вы решаете в чем-то вроде итерации Ньютона, достаточно плохо обусловлены, вы не сможете получить точное решение для этих систем.

Только если потеря точности не поставит под угрозу вашуцифры, если вы подумаете о замене double s на float s;даже если из-за нехватки места вам это нужно, вы должны убедиться, что точность ваших числовых результатов не пострадает.После того, как будет обеспечена достаточная точность для задач, над которыми вы работаете, вы можете приступить к оптимизации пространства и производительности.Вы можете использовать набор тестов CUTEr для проверки ваших процедур оптимизации.

2 голосов
/ 15 марта 2012

В других случаях мне приходилось сталкиваться с необходимостью рассмотреть выбор между типами double и float с точки зрения оптимизации:

  • Сеть. Отправка данных двойной точности через сокетное соединение Очевидно, потребуется больше времени, чем отправка половины этого количества данные.
  • Мобильные и встроенные процессоры могут справляться только с высокими ускорить вычисления с одинарной точностью на сопроцессоре.

Как уже упоминалось в другом ответе, современные настольные процессоры могут обрабатывать с двойной точностью довольно быстро. Тем не менее, вы должны спросить себя, если обработка двойной точности действительно требуется. Я работаю со звуком, и единственный раз, когда я могу думать о том, где мне нужно обработать данные двойной точности будут при использовании фильтров высокого порядка, где Числовые ошибки могут накапливаться. В большинстве случаев этого можно избежать уделяя больше внимания дизайну алгоритма. Есть, конечно, другие научные или инженерные приложения, где двойное Точные данные необходимы для того, чтобы правильно представить огромный динамический диапазон.

Несмотря на это, вопрос о том, сколько усилий нужно потратить на рассмотрение типа данных для использования, действительно зависит от вашей целевой платформы. Если платформа может справиться с удвоениями с незначительными накладными расходами, и у вас есть свободная память, тогда нет необходимости беспокоиться. Профилируйте небольшие разделы тестового кода, чтобы узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...