Когда вы используете float и когда используете двойной

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

Когда вы используете float и когда используете double? Вы всегда используете double, только когда присутствуют ограничения памяти, вы используете float? Или вы всегда используете float, если требование точности не требует использования double? Существуют ли существенные различия в сложности вычислений основных арифметик между float и double? Каковы плюсы и минусы использования float или double? И вы даже использовали длинный двойной?

182 голоса | спросил Jakub Zaverka 28 FebruaryEurope/MoscowbThu, 28 Feb 2013 14:35:51 +0400000000pmThu, 28 Feb 2013 14:35:51 +040013 2013, 14:35:51

7 ответов


173

Выбор по умолчанию для типа с плавающей запятой должен быть double . Это также тип, который вы получаете с литералами с плавающей запятой без суффикса или (в C) стандартных функций, которые работают с числами с плавающей запятой (например, exp , sin ) и т. Д. .).

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

long double может использоваться, если вам нужен больший диапазон или точность, чем double , и если он предоставляет это на вашей целевой платформе.

В общем, float и long double должны быть зарезервированы для использования специалистами, используя double для использования «каждый день».

ответил Bart van Ingen Schenau 28 FebruaryEurope/MoscowbThu, 28 Feb 2013 14:50:07 +0400000000pmThu, 28 Feb 2013 14:50:07 +040013 2013, 14:50:07
40

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

Основными причинами, по которым я могу использовать float, являются:

  1. Вы храните большие массивы чисел и должны потребление памяти программы.
  2. Вы ориентируетесь на систему, которая не поддерживает плавающую точку с двойной точностью. До недавнего времени многие видеокарты поддерживали только одинаковую точность плавающие точки. Я уверен, что есть много маломощных и встроенные процессоры с ограниченной поддержкой с плавающей запятой.
  3. Вы ориентируетесь на аппаратное обеспечение, где одна точность выполняется быстрее чем двойная точность, и ваше приложение сильно использует арифметика с плавающей запятой. На современных процессорах Intel я считаю, что все вычисления с плавающей запятой выполняются с двойной точностью, поэтому вы ничего здесь не получайте.
  4. Вы выполняете низкоуровневую оптимизацию, например, с помощью специальных инструкций CPU, которые работают с несколькими числа за раз.

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

ответил user611910 1 MaramFri, 01 Mar 2013 04:28:03 +04002013-03-01T04:28:03+04:0004 2013, 04:28:03
10

Используйте double для всех ваших вычислений и временных переменных. Используйте float , когда вам нужно поддерживать массив чисел - float [] (если точность достаточна), и вы имеете дело с более чем десятками тысяч float .

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

например. Если у вас есть вход из 100 000 номеров из файла или потока и их нужно сортировать, поместите числа в float [] .

ответил Fai Ng 1 MaramFri, 01 Mar 2013 00:11:41 +04002013-03-01T00:11:41+04:0012 2013, 00:11:41
5

Некоторые платформы (ARM Cortex-M2, Cortex-M4 и т. д.) не поддерживают double (он всегда может быть проверен в справочном руководстве на вашем процессоре. Если нет предупреждений или ошибок компиляции , это не значит, что код оптимален. double можно эмулировать.). Вот почему вам может потребоваться придерживаться int или float .

Если это не так, я бы использовал double .

Вы можете проверить знаменитую статью Д. Голдберга («Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой»). Вы должны подумать дважды, прежде чем использовать арифметику с плавающей запятой. Есть очень большой шанс, что они не нужны вообще в вашей конкретной ситуации.

http://perso.ens-lyon.fr/jean- michel.muller /goldberg.pdf

ответил staroselskii 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 23 Sep 2014 00:48:39 +0400 2014, 00:48:39
3

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

Большинство образцов реального мира ограничены 24-битными ЦАП. Предполагая, что 32 бита точности на вычислениях в реальном мире должны быть достаточными, где значение равно 24 бит точности.

Двойная точность достигается за счет 2x-памяти. Поэтому ограничение использования двойников над поплавками может резко сократить объем памяти /пропускную способность запущенных приложений.

ответил user3034617 19 PM00000080000004131 2014, 20:50:41
-3

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

ответил David Monyancha 7 FebruaryEurope/MoscowbSat, 07 Feb 2015 13:33:57 +0300000000pmSat, 07 Feb 2015 13:33:57 +030015 2015, 13:33:57
-5

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

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

В стандарте C99 сказано следующее:

  

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

Я никогда не использовал long double , но я не так сильно использую C /C ++. Обычно я использую динамически типизированные языки, такие как Python, где вам не нужно заботиться о типах.

Для получения дополнительной информации о Double vs Float см. этот вопрос на SO .

ответил Addison Montgomery 28 FebruaryEurope/MoscowbThu, 28 Feb 2013 14:49:59 +0400000000pmThu, 28 Feb 2013 14:49:59 +040013 2013, 14:49:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132