Особливості целочисленной і речової арифметики

Числові розрахунки можуть проводитися на множині цілих чисел або на безлічі дійсних чисел. З математичної точки зору цілі числа є підмножиною множини дійсних чисел. Тому, здавалося б, можна було б і не розділяти числа на цілі і речові і мати справу тільки з речовим числовим типом даних.

Однак целочисленная арифметика на ЕОМ має три дуже істотні переваги в порівнянні з речової арифметикою:

• цілі числа завжди представимо своїми точними значеннями;

• операції цілочисельний арифметики дають точні результати;

• операції цілочисельний арифметики виконуються швидше, ніж операції речової ( «плаваючою») арифметики.

Недоліком цілого типу даних є порівняно вузький діапазон допустимих значень (для типу Integer - від -32768 до 32767). При виконанні програми автоматично не контролюється вихід значення цілої величини за ці межі. В цьому випадку виходить помилковий результат. Якщо така небезпека існує, то програміст повинен сам передбачати в своїй програмі попередження целочисленного переповнення. Найчастіше цілий тип використовується для представлення лічильників, номерів, індексів та інших цілочисельних величин.

Вам вже відомо, що цілий тип даних є порядковим. Згадаймо, що це означає:

• величини цього типу приймають кінцеве безліч значень, які можуть бути пронумеровані;

• на безлічі значень даного типу працюють поняття: «попередній елемент», «наступний елемент».

Чому ж дійсний тип даних не є впорядкованим? Речові числа в пам'яті ЕОМ представляються у форматі з плаваючою точкою, тобто у вигляді сукупності пари чисел - цілого порядку і нормалізованої мантиси. Оскільки розмір комірки пам'яті обмежений, в більшості випадків мантиса виявляється «обрізаної», іншими словами, наближеною. Точне уявлення в пам'яті має лише дискретне кінцеве безліч речових значень. Тому безліч дійсних чисел в машинному поданні (рис. 26) є дискретне, кінцеве безліч, хоча воно і є відображенням континууму дійсних чисел.

На малюнку зображена позитивна частина дійсної числової осі, на якій штрихами відзначені значення, точно представимо в матеріальному типі даних. Ця картина симетрично відбивається на негативну піввісь.

З ростом абсолютного значення інтервал між сусідніми точками зростає. Він дорівнює (при двійковій-нормалізованому формі з плаваючою точкою) 2-t х 2p = 2p-t, де р - порядок числа, a t - кількість двійкових розрядів в мантисі. Ясно, що з ростом абсолютної величини числа його порядок (р) зростає і, отже, зростає крок між двома сусідніми значеннями. мінімальний крок

Наприклад, якщо Рmin = -64; рmax = 63; t = 24, то маємо # 916; rmin = 2-88; # 916; rmax = 239.

Здавалося б, значення безлічі точно представимо дійсних чисел можна пронумерувати і таким чином визначити на ньому поняття «наступний», «попередній». Однак відстань між двома послідовними значеннями на цій множині виявляється величиною суб'єктивною, зокрема, залежить від розміру осередку пам'яті, в якій зберігається число. Наприклад, якщо під мантиссу виділяється 3 байта, то таке значення виходить шляхом додавання до мантисі одиниці в 24-му розряді; якщо 5 байт - одиниці в 40-м розряді.

Нескінченна кількість дійсних чисел взагалі непредставімо точно в пам'яті ЕОМ. Якщо дійсне значення X потрапляє між двома точно перед ставімие значеннями ri і ri + 1, то воно замінюється на значення меншого за модулем з цієї пари чисел (деякі типи процесорів виконують «правильне» округлення). Отже, в загальному випадку речові числа зберігаються в пам'яті приблизно, тобто несуть в собі похибку, яка називається похибкою машинного округлення.

Зі сказаного випливає, що якщо два числа X і Y задовольняють умовам ri

Різниця між речової одиницею і найближчим до неї числом, уявленим в пам'яті машини, називається машинним епсилон # 949 ;. Інакше кажучи, якщо ri = 1, то ri + 1 = 1 + # 949 ;. Легко зрозуміти, що величина машинного # 949; пов'язана тільки з розрядністю мантиси в поданні дійсних чисел на даній ЕОМ.

Для визначення величини машинного # 949; можна використовувати наступну програму:

While 1.0 + Eps> l.0 Do