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

Должен ли я использовать double или float?

В чем преимущества и недостатки использования одного, а не другого в С++?

4b9b3361

Ответ 1

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

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

Многие компиляторы в любом случае расширяют математику с плавающей запятой в "нестрочном" режиме (т.е. используют более широкий тип с плавающей запятой, доступный на аппаратном уровне, например, 80-битные и 128-битные), это также следует учитывать. На практике вы можете видеть какую-либо разницу в скорости. В любом случае они являются туземцами на оборудовании.

Ответ 2

Этот вопрос невозможно ответить, поскольку нет никакого контекста для вопроса. Вот некоторые вещи, которые могут повлиять на выбор:

  • Реализация компилятора поплавков, удваивается и удваивается. Стандарт С++ гласит:

    Существует три типа с плавающей запятой: float, double и long double. Тип double обеспечивает как минимум такую ​​же точность, как float, а double double double обеспечивает как минимум такую ​​же точность, как double.

    Итак, все три могут быть одного размера в памяти.

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

  • Архитектура FPU. IAP FPU имеет внутреннюю внутреннюю память 80 бит - 32 бит, а 64 бит - по 80 бит при нагрузке и уменьшены на складе. Там также SIMD, который может выполнять четыре 32-битных поплавка или два 64-битных поплавка параллельно. Использование SIMD не определено в стандарте, поэтому для компилятора требуется более сложный анализ, чтобы определить, можно ли использовать SIMD или использовать специальные функции (библиотеки или внутренние функции). Результатом 80-битного внутреннего формата является то, что вы можете получить несколько разные результаты в зависимости от того, как часто данные сохраняются в ОЗУ (таким образом, теряя точность). По этой причине компиляторы не оптимизируют код с плавающей запятой особенно хорошо.

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

  • Стандарт не применяет какой-либо конкретный формат для значений с плавающей запятой.

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

Ответ 3

Если у вас есть какая-то конкретная причина для этого, используйте double.

Возможно, удивительно, что это двойной и не float, который является "нормальным" типом с плавающей запятой в C (и С++). Стандартные математические функции, такие как sin и log, принимают в качестве аргументов удвоение и возвращают удвоения. Обычный литерал с плавающей запятой, как при написании 3.14 в вашей программе, имеет тип double. Не плавать.

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

Ответ 4

Двойной более точный, но кодируется по 8 байт. float - всего 4 байта, поэтому меньше места и меньше точности.

Вы должны быть очень осторожны, если у вас есть двойной и плавающий в приложении. Из-за этого у меня была ошибка. Одна часть кода использовала float, в то время как остальная часть кода использовала double. Копирование double to float, а затем float в double может привести к ошибкам точности, которые могут иметь большое влияние. В моем случае это был химический factory... надеюсь, что это не имело драматических последствий:)

Я думаю, что из-за такого рода ошибок, что ракета Ariane 6 взорвалась несколько лет назад!!!

Подумайте о типе, который будет использоваться для переменной

Ответ 5

Я лично повторяю все время, пока не увижу некоторые узкие места. Затем я рассматриваю перемещение в float или оптимизацию какой-либо другой части

Ответ 6

Это зависит от того, как компилятор реализует double. Это законно для double и float для того же типа (и он находится на некоторых системах).

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

Несколько других людей упомянули о результатах работы. Это было бы точно в моем списке соображений. Правильность должна быть вашим рассмотрением №1.

Ответ 7

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

Ответ 8

Я думаю, что независимо от различий (которые, как отмечают все, поплавки занимают меньше места и, как правило, быстрее)... кто-нибудь когда-либо сталкивается с проблемами производительности, используя double? Я говорю, использую double... и если позже вы решите "ничего себе, это действительно медленно"... найдите узкое место в производительности (что, вероятно, не факт, что вы использовали double). ТОГДА, если он все еще слишком медленный для вас, посмотрите, где вы можете пожертвовать некоторой точностью и использовать float.

Ответ 9

Это сильно зависит от процессора, наиболее очевидные компромиссы между точностью и памятью. С ОЗУ ОЗУ память не является большой проблемой, поэтому обычно лучше использовать double s.

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

Ответ 10

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