(Примітка. Ця стаття передбачає, що читачі знають основи інформатики)
Багато початківців програмістів / студентів, які навчаються на комп’ютерні науки, задають часто задані питання, що стосуються конкретної галузі в галузі інформатики, яку вони вивчають. Більшість курсів для початківців починаються з тем системи числення, яка використовується в сучасних комп'ютерах, включаючи двійкові, десятковий, вісімковий і шістнадцятковий система. Це формати числових комп'ютерів, які є внутрішніми представленнями числових значень на комп'ютерах (або калькуляторах та будь-яких інших видах цифрових комп'ютерів). Ці значення зберігаються як "групування бітів".
Як відомо, комп'ютери представляють дані у наборах двійкових цифр (тобто у поєднанні 1с і 0с, як от, 1111 рік представляє 15 у десятковій системі) має сенс навчитись про різні формати чисел, які використовуються для представлення динамічного діапазону значень, оскільки вони складають основні блоки обчислення / оброблення чисел у будь-якому операції. Після того, як система числення буде визначена в класі (часто неякісно), учні спокушаються перейти на різні формати чисел одного типу (тобто., Арифметика з плаваючою комою), які мають певну точність і діапазон чисел. Таким чином, вони змушені дізнаватися нюанси між певними типами. Два найпоширеніші типи даних - це два Поплавок і Подвійний, і хоча вони спрямовані на ті самі потреби (тобто., Арифметика з плаваючою комою), є досить яка різниця у їх внутрішньому представленні та загальному впливі на розрахунок у програмі. Прикро, що багато програмістів пропускають нюанси між типами даних Flat та Double і в кінцевому підсумку неправильно використовують їх у місцях, де їх не слід використовувати в першу чергу. Зрештою, це призводить до прорахунків в інших частинах програми.
У цій статті я розповім вам про різницю між float та double з прикладами коду в мові програмування на C. Давайте розпочнемо!
Float і Double - це представлення даних, які використовуються для арифметичних операцій з плаваючою комою, придумайте десяткові числа, які ви обчислюєте в класі математики, наприклад, 20.123, 16.23, 10.2, і т. д., це не цілі числа (тобто., 2, 5, 15, тощо), тому вони вимагають розгляду дробів у двійковій. Як результуючі десяткові числа (тобто., 20.123, 16.23, тощо) не може бути легко представлений нормальним бінарним форматом (тобто, цілим числом). Основна відмінність Float від Double полягає в тому, що перший - це дані з плаваючою точкою з одною точністю (32 біти), а другий - тип даних з плаваючою точкою подвійної точності (64 біт). Double називається "подвійним", оскільки це в основному версія з подвійною точністю Float. Якщо ви підраховуєте величезну суму (подумайте про тисячі 0 у кількості), то неточності будуть меншими в подвійному, і ви не втратите великої точності.
Краще розробитись, використовуючи приклади коду. Далі йде операція на Float і Double через математичні функції, що надаються мовою C:
#включати
int main ()
float num1 = 1.f / 82;
float num2 = 0;
for (int i = 0; i < 738; ++i)
num2 + = num1;
printf ("%. 7g \ n", num2);
подвійне число3 = 1,0 / 82;
подвійне число4 = 0;
for (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);
подвійний num2 = sqrt (2382719676512365.1230112312312312);
printf ("% f \ n", num1);
printf ("% f \ n", num2);
getchar ();
Він дає такий вихід:
48813108.000000
48813109.678778
Тут ви бачите, що відповідь у Double має кращу точність.
Загалом, краще використовувати Double для арифметики з плаваючою комою, оскільки кілька стандартних математичних функцій в C працюють на подвійних, а сучасні комп'ютери надзвичайно швидкі та ефективні для подвійних обчислень з плаваючою комою. Це призводить до зменшення потреби використання 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 в більшості місць наосліп, особливо якщо ви орієнтуєтесь на сучасні комп’ютери, оскільки шанси на низьку ефективність через використання подвійної арифметики з плаваючою комою є малоймовірними. Якщо у вас є якісь питання, тоді ви можете задати їх у розділі коментарів нижче!