Подтвердить что ты не робот

Double или float, что быстрее?

Я читаю "ускоренный С++". Я нашел одно предложение, в котором говорится: "Иногда double работает быстрее, чем float в С++". После чтения предложения я запутался в работе float и double. Пожалуйста, объясните мне этот момент.

4b9b3361

Ответ 1

Зависит от того, что делает собственное устройство.

  • Если аппаратное обеспечение реализует double (например, x86), то float эмулируется путем расширения его там, и преобразование будет стоить время. В этом случае double будет быстрее.

  • Если аппаратное обеспечение реализует только float, то эмуляция double с ним будет стоить еще больше времени. В этом случае float будет быстрее.

  • И если аппаратное обеспечение не реализует ни одного, и оба должны быть реализованы в программном обеспечении. В этом случае оба будут медленными, но двойной будет немного медленнее (больше нагрузки и операций хранения, по крайней мере).

Цитата, которую вы упомянули, вероятно, относится к платформе x86, где был указан первый случай. Но это вообще не выполняется.

Ответ 2

Вы можете найти полный ответ в этой статье

Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой

Это цитата из предыдущего потока с float x double относительно полосы пропускания памяти

Если двойной требует больше памяти, чем поплавок, тогда это потребуется больше времени для чтения данных. Это наивный ответ. На современном IA32, все зависит от того, где данные исходит из. Если он в кеше L1, нагрузка пренебрежимо мала, если данные поступают из одной строки кэша. Если он охватывает более одной строки кеша там небольшие накладные расходы. Если это из L2, требуется еще много времени, если это в ОЗУ, тогда он дольше и наконец, если на диске это огромный время. Таким образом, выбор поплавка или двойной менее важен, чем то, как данные используется. Если вы хотите сделать небольшой расчет по партиям последовательных данных предпочтительным является небольшой тип данных. Выполнение большого количества вычислений на небольшом набор данных позволит вам использовать больше типы данных с любыми значительными эффект. Если вы получаете доступ к данным очень случайным образом, то выбор данных размер неважен - данные загружаются в страницах/кеш-строках. Так что даже если вы нужен только байт из ОЗУ, вы можете получить 32 байта (это очень в зависимости от архитектуры система). Помимо всего этого, CPU/FPU может быть суперскалярным (aka Конвейерный). Таким образом, даже если нагрузка может выполнить несколько циклов, CPU/FPU может быть занятым чем-то другим ( например, умножить), который скрывает время загрузки до степени

Ответ 3

Короткий ответ: зависит от.

Процессор с x87 будет сжимать поплавки и удваивает одинаково быстро. Векторизованный код будет работать быстрее с поплавками, потому что SSE может хрустить 4 поплавки или 2 удвоения за один проход.

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

Ответ 4

Я могу думать о двух основных случаях, когда удваивается быстрее, чем floats:

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

  • Вам действительно нужна точность удвоений. Теперь, если вы используете поплавки, вам придется использовать два поплавка, чтобы достичь аналогичной точности в два раза. Эмуляция истинного двойника с поплавками будет медленнее, чем использование поплавков в первую очередь.

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

Для полноты я также даю некоторые причины для того, чтобы противоположный случай поплавков был быстрее. Вы можете сами убедиться, какие причины доминируют в вашем случае:

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

  • Они сохраняют полосу пропускания памяти, поскольку они занимают половину пространства на число.

  • Существуют также платформы, которые могут обрабатывать больше поплавков, чем парные Параллельно.

Ответ 5

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

Однако параллельные инструкции SSE позволяют обрабатывать четыре поплавки в одной инструкции, но только два удвоения, поэтому здесь float может быть значительно быстрее.

Ответ 6

Есть только одна причина, по которой 32-битные поплавки могут быть медленнее, чем 64-разрядные удваиваются (или 80-бит 80x87). И это выравнивание. Помимо этого, поплавки занимают меньше памяти, что обычно означает более быстрый доступ, лучшую производительность кеша. Для обработки 32-разрядных инструкций также требуется меньше циклов. И даже если (co) -процессор не имеет 32-битных инструкций, он может выполнять их на 64-битных регистрах с одинаковой скоростью. Вероятно, возможно создать тестовый пример, где удваивается быстрее, чем float, и v.v., но мои измерения реальных статистических альгос не показали заметной разницы.

Ответ 7

В экспериментах с добавлением 3,3 для 2000000000 раз результаты:

Summation time in s: 2.82 summed value: 6.71089e+07 // float
Summation time in s: 2.78585 summed value: 6.6e+09 // double
Summation time in s: 2.76812 summed value: 6.6e+09 // long double

Так что double быстрее и по умолчанию в C и С++. Он более переносимый и по умолчанию используется во всех библиотечных функциях C и С++. Alos double имеет значительно более высокую точность, чем плавающий.

Даже Stroustrup рекомендует двойной поплавок:

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

Возможно, единственный случай, когда вы должны использовать float вместо double, - это 64-битное аппаратное обеспечение с современным gcc. Поскольку float меньше; double - 8 байтов, а float - 4 байта.

Ответ 8

float обычно быстрее. double предлагает большую точность. Однако производительность может варьироваться в некоторых случаях, если используются специальные расширения процессора, такие как 3dNow или SSE.