Float и Double - какой из них я должен использовать?

Anonim

(Примечание: в этой статье предполагается, что читатели знают об основах информатики)

Многие новички-программисты / студенты, обучающиеся в области компьютерных наук, задают часто задаваемые вопросы, имеющие отношение к конкретной области в области компьютерных наук, которые они изучают. Большинство начинающих курсов начинаются с тем номера системы, который используется на современных компьютерах, включая двоичный , десятичный , восьмеричный а также шестнадцатеричный система. Это форматы номеров компьютеров, которые являются внутренними представлениями числовых значений на компьютерах (или калькуляторах и любых других цифровых компьютерах). Эти значения сохраняются как «группировка бит».

Поскольку мы знаем, что компьютеры представляют данные в наборах двоичных цифр (т. Е. В комбинации 1s а также 0s, такие как, 1111 представляет собой 15 в десятичной системе), имеет смысл преподавать различные форматы чисел, которые используются для представления динамического диапазона значений, поскольку они составляют основные блоки обработки вычислений / число в любой операции. Как только система чисел определена в классе (часто плохо), у студентов возникает желание перейти на разные форматы чисел в одном и том же типе (т. Е. арифметика с плавающей запятой ), которые имеют определенную точность и диапазон чисел. Таким образом, они вынуждены изучать нюансы между определенными типами. Два из наиболее часто используемых типов данных: терка а также двойной , и в то время как они нацелены на одни и те же потребности (то есть, арифметика с плавающей запятой ), в их внутреннем представлении и общем влиянии на расчет в программе есть определенная разница. К сожалению, многие программисты пропускают нюансы между плоскими и двойными типами данных и в конечном итоге злоупотребляют ими в тех местах, где их не следует использовать в первую очередь. В конечном итоге это приводит к просчетам в других частях программы.

В этой статье я расскажу вам разницу между float и double с примерами кода на языке программирования C. Давайте начнем!

Поплавок против Двойного … В чем дело?

Float и Double - это представление данных, которое используется для арифметических операций с плавающей запятой, подумайте о десятичных числах, которые вы вычисляете в классе математики, например, 20.123, 16.23, 10.2и т. д., они не являются целыми числами (т. 2, 5, 15и т. д.), поэтому они требуют рассмотрения фракций в двоичном формате. В результате десятичные числа (т. Е. 20.123, 16.23, и т. д.) не может быть легко представлен нормальным двоичным форматом (т. е. Integer). Основное различие между Float и Double заключается в том, что первое представляет собой данные с плавающей запятой с единственной точностью (32-разрядные), в то время как второй тип данных с плавающей точкой двойной точности (64-разрядная). Двойной называется «двойным», потому что это в основном версия с двойной точностью Float. Если вы вычисляете огромную сумму (думайте о тысячах 0 в номере), тогда неточности будут меньше в Double, и вы не потеряете много точности.

Лучше проработать с использованием примеров кода. Ниже приведена операция по Float и Double через математические функции, предоставляемые на языке C:

#включают

int main () {

float num1 = 1.f / 82;

float num2 = 0;

для (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%. 7g n", num2);

double num3 = 1.0 / 82;

double num4 = 0;

для (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("%. 15g n", num4);

GetChar ();

}

Он печатает следующее:

9.000031

8.99999999999983

Здесь вы можете видеть, что небольшая разница в точности Float и Double дает совсем другой ответ, хотя Double кажется более точным, чем Float.

Ниже приведен пример функции sqrt () в C:

#включают

#включают

int main () {

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

GetChar ();

}

Он дает следующий результат:

48813108.000000

48813109.678778

Здесь вы можете видеть, что ответ в Double имеет более высокую точность.

В общем, лучше использовать Double для арифметики с плавающей запятой, поскольку несколько стандартных математических функций в C работают на Double и современных компьютерах, чрезвычайно быстрые и эффективные для расчетов с двойной плавающей запятой. Это приводит к уменьшению необходимости использования Float, если вам не нужно работать с множеством чисел с плавающей запятой (думайте о больших массивах с тысячами 0 в числах) или вы работаете в системе, прецизионная плавающая точка, так как многие графические процессоры, маломощные устройства и определенные платформы (ARM Cortex-M2, Cortex-M4 и т. д.) не поддерживают Double еще, тогда вы должны использовать Float. Кроме того, следует помнить, что некоторые графические процессоры / процессоры работают лучше / эффективнее в обработке Float, например, при вычислении векторов / матриц, поэтому вам может потребоваться найти руководство по спецификации оборудования / документацию, чтобы лучше решить, какой из них вы должны использовать для конкретной машины.

Существует редко причина использовать Float вместо Double в коде, ориентированном на современные компьютеры.Дополнительная точность в Double уменьшает, но не устраняет, вероятность ошибок округления или другую неточность, которая может вызвать проблемы в других частях программы. Многие математические функции или операторы преобразуют и возвращают Double, поэтому вам не нужно возвращать числа Float, так как это может привести к потере точности. Для подробного анализа арифметики с плавающей точкой я настоятельно рекомендую вам прочитать эту потрясающую статью (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Резюме

Итак … в двух словах:

Места, где вы должны использовать Float:

  • Если вы настроите таргетинг на оборудование, где одноточечная точность выше, чем двойная точность.
  • Ваше приложение сильно использует арифметику с плавающей запятой, например, тысячи чисел с тысячами нулей.
  • Вы делаете очень низкоуровневую оптимизацию. Например, вы используете специальные инструкции CPU (т. Е. SSE, SSE2, AVX и т. Д.), Которые работают с несколькими числами / массивами / векторами за раз.

Заключение

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