logo
Модуль 03 Віконні застосування / Лекційний матемріал / Частина 1

3.3. Тип даних з плаваючою крапкою

Ми тільки що розглянули різні типи цілих чисел. Але насправді дуже невеликий відсоток завдань може працювати з цілими числами. Більше все-таки доводиться працювати з нецілими або, як їх ще називають, дійсними числами. Для таких чисел в мові теж існують свої ключові слова, які задають тип чисел. Представлення таких чисел в пам'яті комп'ютера називається представленням числа з плаваючою крапкою (іноді називають "з плаваючою комою"). Якщо ціле число розташовується в пам'яті, виділеній йому компілятором відповідно до зазначеного типу при оголошенні у вигляді послідовності цифр в записі числа (для простоти розуміння: насправді це не завжди так, тому що числа представляються у вигляді певних кодів), то число з плаваючою крапкою представляється у виділеній для нього компілятором пам'яті у вигляді двох частин: одна частина називається мантисою. Вона за абсолютною величиною завжди менше одиниці. А інша частина називається порядком числа. Наприклад, число 125,5 можна записати у вигляді 0,1255×103. Тут 0,1255 - мантиса, а 3 - порядок числа. Ось це число і стане зберігатися у відведеній для нього області пам'яті так: знак мантиси - мантиса - знак порядку - порядок. Ось тут ще раз видно, як важливо у програмі задавати тип даного. Для задання типу чисел з плаваючою крапкою існують два ключові слова: float і double. Якщо для float компілятор виділяє вісім байтів пам'яті, то для double - шістнадцять. Потрібно пам'ятати, що арифметичні операції з числами з плаваючою крапкою не точні, т. т. мають певну погрішність на відміну від операцій з цілими числами. Наприклад, ділимо одне число на інше. Без остачі не ділиться. Значить, потрібно десь зупинитися і відкинути "хвіст", що не поміщається в область пам'яті, відведеної для числа. Ось вже і неточність виникла. Неточність виникає і при виконанні операцій, при яких доводиться вирівнювати порядки чисел і за рахунок цього зсувати їх мантиси, щоб число не змінилося. При зсуві мантиси теж втрачаються розряди числа. Знову виникає неточність. А коли потрібно вирівнювати порядки чисел? Наприклад, при операції додавання: якщо у операндів різні порядки, то їх спочатку потрібно вирівняти (відповідно, щоб число не змінилося, потрібно мантису зсунути вліво або управо на число розрядів, на яке змінився її порядок), потім додати мантиси і до суми додати спільний порядок. Але чим більше області пам'яті для зберігання числа, тим більше число цифр дробової частини можна зберігати в цій області. Тобто тим число буде з більш високою точністю. Числа типу float мають точність у 6-7 десяткових цифр після крапки, а числа типу double - 15-16 цифр після крапки. Через те, що числа з плаваючою крапкою в комп’ютері - неточні, т. т. мають деяку погрішність, порівнювати їх між собою, як це можна робити з цілими числами, треба за особливим правилом. Нехай, у вас є число 125,5. Коли ви його введете в комп'ютер, то число в ньому матиме інший вигляд. Наприклад, 125,500001. Навіть просто через помилку округлення. Якщо тепер ви почнете в програмі порівнювати число, що зберігається там, з константою 125.5, у вас нічого не вийде, т. т. числа, фактично, різні. Тому числа з плаваючою крапкою порівнюються не на повний збіг, а на співпадіння з точністю до деякого значення. Наприклад, нехай 125,500001 зберігається в деякій змінній flo. Щоб число потрапило в цю змінну, ми повинні його оголосити в програмі, і компілятор виділить йому пам'ять:

float flo = 125.5;

Або іншим способом:

float flo;

flo = 125.5;

Тоді порівняння вмісту flo і значення 125,5 можна виконати так: якщо (flo - 125.5)<0.01, то величини рівні.