Я все еще новичок в программировании, и у меня всегда есть больше вопросов, чем наши поиски книг или интернет могут ответить (если я что-то пропустил). Поэтому я заранее прошу прощения, если на этот вопрос ответили, но я не смог его найти.
Я понимаю, что float имеет меньший диапазон, чем double, что делает его менее точным, и насколько я понимаю, long double еще более точен (?). Итак, мой вопрос: почему вы хотите использовать переменную, которая менее точна? Это как-то связано с разными платформами, разными версиями ОС, разными компиляторами? Или есть определенные моменты в программировании, где стратегически более выгодно использовать плавающее число вместо двойного / длинного двойного?
Спасибо всем!
Почти во всех процессорах «меньшие» числа с плавающей запятой занимают одинаковые или меньшие такты при исполнении. Иногда разница не очень большая (или ничего), в других случаях она может быть буквально вдвое больше циклов для double
против float
,
Конечно, фактор памяти, который влияет на использование кэша, также будет иметь значение. float
занимает половину размера double
, а также long double
еще больше.
Изменить: Другой побочный эффект меньшего размера заключается в том, что расширения SIMD процессора (3DNow !, SSE, AVX в x86 и аналогичные расширения доступны в нескольких других архитектурах) могут работать только с float
или может взять вдвое больше float
против double
(и, насколько я знаю, инструкции SIMD для long double
в любом процессоре). Так что это может улучшить производительность, если float
используется против double
, обрабатывая вдвое больше данных за один раз. Конец редактирования.
Итак, предположим, что 6-7 цифр точности достаточно для того, что вам нужно, и диапазон +/- 10+/ -38 достаточно, тогда float
должен быть использован. Если вам нужно больше цифр в номере или больший диапазон, перейдите к double
и если этого недостаточно, используйте long double
, Но для большинства вещей double
должно быть совершенно адекватным.
Очевидно, что важность использования «правильного размера» становится более важной, когда у вас есть много вычислений или много данных для работы — если есть 5 переменных, и вы просто используете каждую пару раз в программе, которая делает миллион других вещей, кого это волнует? Если вы проводите расчеты гидродинамики для определения того, насколько хорошо автомобиль Формулы 1 развивает скорость 200 миль в час, у вас, вероятно, есть несколько десятков миллионов точек данных для вычисления, и каждая точка данных должна рассчитываться десятки раз в секунду движения автомобиля, затем использование нескольких дополнительных тактов в каждом расчете значительно замедлит процесс моделирования.
Использование поплавка сопряжено с двумя затратами: очевидный из-за его ограниченного диапазона и точности, и, менее очевидно, более сложный анализ, налагаемый этими ограничениями.
Часто относительно легко определить, что двойного достаточно, даже в тех случаях, когда для значительного численного анализа потребуется достаточное количество операций с плавающей запятой. Это экономит затраты на разработку и риск неверных результатов, если более сложный анализ не будет выполнен правильно.
Самое большое преимущество Float на многих процессорах — это уменьшение занимаемой памяти. Это приводит к большему количеству чисел на строку кэша и большей пропускной способности памяти в терминах числа передаваемых в секунду. Любой выигрыш в производительности вычислений обычно относительно невелик — действительно, популярные процессоры выполняют всю арифметику с плавающей запятой в одном формате, который шире двойного.
Кажется, лучше использовать double, если не выполняются два условия — для их существенной проблемы с производительностью памяти достаточно цифр, и разработчики могут показать, что float является достаточно точным.
Возможно, вам будет интересно увидеть ответ, опубликованный здесь Должен ли я использовать double или float?
Но это сводится к тому, что объем памяти зависит от точности, необходимой для данной ситуации. В физическом движке вы можете больше заботиться о точности, поэтому было бы разумнее использовать double или long double.
Нижняя линия:
Вы должны использовать столько точности, сколько вам нужно для данного алгоритма
Основной принцип здесь не будет использовать больше, чем вам нужно.
Первое соображение касается использования памяти, вы, вероятно, уже поняли, что если вы делаете только один дубль, то ничего страшного, но что, если вы создаете миллиард, чем вы просто использовали вдвое больше места в памяти, чем вы тоже.
Далее идет загрузка процессора, я полагаю, что на многих процессорах, если вы используете меньшие типы данных, он может выполнять потоковую форму, когда он выполняет несколько операций одновременно.
Таким образом, расширение этой части ответа Инструкции SSE в основном это позволяет вам использовать упакованные данные выполнять несколько операций с плавающей запятой одновременно, что в идеализированный Дело может удвоить скорость вашей программы.
Наконец, удобочитаемость, когда кто-то читает ваш код, если вы используете число с плавающей запятой, он сразу же поймет, что вы не наберете определенное число. ИМО иногда правильное число точности просто будет течь лучше в коде.
Float использует меньше памяти, чем double, поэтому, если вам не нужно, чтобы ваш номер был размером с double, вы также можете использовать float, так как он будет занимать меньше памяти.
Точно так же, как если бы вы не использовали автобус, чтобы водить себя и друга на пляж … вам было бы гораздо лучше ехать на 2-местной машине.
То же самое относится к двойному по длинному двойному … только зарезервируйте столько памяти, сколько вам нужно. В противном случае, используя более сложный код, вы рискуете использовать слишком много памяти и замедлить или завершить процесс.