Разлика между Float и Double - Кой трябва да използвам?

(Забележка: Тази статия предполага, че читателите знаят за основите на компютърните науки)

Много начинаещи програмисти / студенти, които се записват в компютърни науки, задават често задаваните въпроси, които са от значение за конкретната област в рамките на компютърните науки, които учат. Повечето курсове за начинаещи започват с темите на числовата система, която се използва в съвременните компютри, включително двоен, десетичен, осмична и шестнадесетичен система. Това са форматите на компютърните номера, които са вътрешните представи на цифрови стойности в компютрите (или калкулаторите и всякакъв друг вид цифрови компютри). Тези стойности се съхраняват като „групиране на битове“.

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

В тази статия ще ви кажа разликата между float и double с примерите на кода в езика за програмиране на C. Да започваме!

Float срещу Double ... Каква е сделката?

Float и Double са представяне на данни, които се използват за аритметичните операции с плаваща запетая, помислете за десетичните числа, които изчислявате в математическия клас, като напр., 20,123, 16.23, 10.2, и т.н., те не са цели числа (т.е.., 2, 5, 15, и т.н.), така че те изискват разглеждане на дроби в двоичното. Като резултатните десетични числа (т.е.., 20,123, 16.23, и т.н.) не могат да бъдат лесно представени с нормален двоичен формат (т.е., Integer). Основната разлика между Float и Double е, че първата е единична точност (32-битови) данни с плаваща запетая, докато втората е тип с данни с плаваща запетая с двойна точност (64-битов). Double се нарича „двойна“, защото всъщност е версия с двойна точност на Float. Ако изчислявате огромна сума (помислете за хилядите 0 на брой), неточностите ще бъдат по-малки в Double и няма да загубите голяма точност.

По-добре е да се изработи с помощта на кодовите примери. Следва операцията на Float и Double чрез математическите функции, предоставени на езика C:

#include

int main ()

float num1 = 1.f / 82;

float num2 = 0;

за (int i = 0; i < 738; ++i)

num2 + = num1;

printf („%. 7g \ n“, num2);

двойно число3 = 1,0 / 82;

двойно число4 = 0;

за (int i = 0; i < 738; ++i)

num4 + = num3;

printf („%. 15g \ n“, число4);

getchar ();

Той отпечатва следното:

9.000031

8.99999999999983

Тук можете да видите, че малката разлика в точността на Float и Double дава съвсем различен отговор, макар че Double изглежда по-точен от Float.

Следва примера на функцията sqrt () в C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

двойно число2 = 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:

  • Ако се насочвате към хардуер, където едноточността е по-бърза от двойната точност.
  • Приложението ви използва широко аритметика с плаваща запетая, като хиляди числа с хиляди 0.
  • Правиш много ниско ниво на оптимизация. Например, вие използвате специални инструкции за процесора (т.е. SSE, SSE2, AVX и т.н.), които работят на множество числа / масиви / вектори наведнъж.

заключение

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