(Забележка: Тази статия предполага, че читателите знаят за основите на компютърните науки)
Много начинаещи програмисти / студенти, които се записват в компютърни науки, задават често задаваните въпроси, които са от значение за конкретната област в рамките на компютърните науки, които учат. Повечето курсове за начинаещи започват с темите на числовата система, която се използва в съвременните компютри, включително двоен, десетичен, осмична и шестнадесетичен система. Това са форматите на компютърните номера, които са вътрешните представи на цифрови стойности в компютрите (или калкулаторите и всякакъв друг вид цифрови компютри). Тези стойности се съхраняват като „групиране на битове“.
Както знаем компютрите представят данни в набори от двоични цифри (т.е. в комбинация от 1s и 0s, като, 1111 Представлява 15 в десетична система) има смисъл да се преподава за различните формати на числата, които се използват за представяне на динамичен диапазон от стойности, тъй като те съставляват основните блокове на изчислението / обработката на числа при всякакъв вид операция. След като системата за броене е дефинирана в класната стая (често лошо), учениците се изкушават да преминат към различните формати на числа в рамките на един и същи тип (т.е.., аритметика с плаваща запетая), които имат определена точност и диапазон на числата. Така те са принудени да научат нюансите между определени видове. Два от най-често използваните типове данни са поплавък и двойно, и докато те са насочени към едни и същи нужди (т.е.., аритметика с плаваща запетая), има доста известна разлика във вътрешното им представяне и цялостния ефект върху изчислението в програмата. Жалко е, че много програмисти пропускат нюансите между Flat и Double типовете данни и в крайна сметка ги злоупотребяват на места, където те не трябва да се използват на първо място. В крайна сметка се стига до грешки в други части на програмата.
В тази статия ще ви кажа разликата между float и double с примерите на кода в езика за програмиране на C. Да започваме!
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:
В тази статия подчертах разликата между Float и Double и коя от тях трябва да се използва на конкретни места. Може би е по-добре да използвате Double на повечето места сляпо, особено ако се насочите към съвременните компютри, тъй като шансовете за ниска ефективност поради използването на Double аритметика с плаваща запетая е много малко вероятно. Ако имате въпроси, можете да попитате в секцията за коментари по-долу!