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

(Примітка. Ця стаття передбачає, що читачі знають основи інформатики)

Багато початківців програмістів / студентів, які навчаються на комп’ютерні науки, задають часто задані питання, що стосуються конкретної галузі в галузі інформатики, яку вони вивчають. Більшість курсів для початківців починаються з тем системи числення, яка використовується в сучасних комп'ютерах, включаючи двійкові, десятковий, вісімковий і шістнадцятковий система. Це формати числових комп'ютерів, які є внутрішніми представленнями числових значень на комп'ютерах (або калькуляторах та будь-яких інших видах цифрових комп'ютерів). Ці значення зберігаються як "групування бітів".

Як відомо, комп'ютери представляють дані у наборах двійкових цифр (тобто у поєднанні і , як от, 1111 рік представляє 15 у десятковій системі) має сенс навчитись про різні формати чисел, які використовуються для представлення динамічного діапазону значень, оскільки вони складають основні блоки обчислення / оброблення чисел у будь-якому операції. Після того, як система числення буде визначена в класі (часто неякісно), учні спокушаються перейти на різні формати чисел одного типу (тобто., Арифметика з плаваючою комою), які мають певну точність і діапазон чисел. Таким чином, вони змушені дізнаватися нюанси між певними типами. Два найпоширеніші типи даних - це два Поплавок і Подвійний, і хоча вони спрямовані на ті самі потреби (тобто., Арифметика з плаваючою комою), є досить яка різниця у їх внутрішньому представленні та загальному впливі на розрахунок у програмі. Прикро, що багато програмістів пропускають нюанси між типами даних Flat та Double і в кінцевому підсумку неправильно використовують їх у місцях, де їх не слід використовувати в першу чергу. Зрештою, це призводить до прорахунків в інших частинах програми.

У цій статті я розповім вам про різницю між float та double з прикладами коду в мові програмування на C. Давайте розпочнемо!

Float vs Double ... Яка угода?

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:

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

Висновок

У цій статті я висвітлив різницю між Float і Double, і яку саме слід використовувати в певних місцях. Можливо, краще використовувати Double в більшості місць наосліп, особливо якщо ви орієнтуєтесь на сучасні комп’ютери, оскільки шанси на низьку ефективність через використання подвійної арифметики з плаваючою комою є малоймовірними. Якщо у вас є якісь питання, тоді ви можете задати їх у розділі коментарів нижче!