Разница между поплавком и двойной - какую мне использовать?

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

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

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

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

Float vs Double ... В чем дело?

Float и Double - это представления данных, которые используются для арифметических операций с плавающей запятой, представьте десятичные числа, которые вы вычисляете в классе математики, например:, 20,123, 16,23, 10,2, и т.д., они не являются целыми числами (т.е.., 2, 5, 15, и т. д.), поэтому они требуют рассмотрения дробей в двоичном виде. Как результирующие десятичные числа (т.е.., 20,123, 16,23, и т. д.) не могут быть легко представлены в обычном двоичном формате (т. е. целое число). Основное различие между Float и Double заключается в том, что первый тип данных с плавающей запятой одинарной (32-битной), а второй - тип данных с плавающей запятой двойной точности (64-битной). Double называется «double», потому что это в основном версия Float с двойной точностью. Если вы вычисляете огромное количество (представьте тысячи нулей в числе), то неточности будут меньше в Double, и вы не потеряете много точности.

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

#включают

int main ()

число с плавающей запятой1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

printf («%. 7g \ n», num2);

двойное число 3 = 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, а современные компьютеры чрезвычайно быстры и эффективны для вычисления Double с плавающей точкой. Это приводит к уменьшению необходимости использовать Float, если вам не нужно работать с большим числом чисел с плавающей запятой (например, большие массивы с тысячами нулей) или вы работаете в системе, которая не поддерживает двойные числа. точность с плавающей запятой, так как многие графические процессоры, маломощные устройства и некоторые платформы (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:

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

Вывод

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