Особливості дійсних чисел в delphi - все про it і програмуванні

Сторінка 2 з 7

Речові типи Delphi

У Delphi існує чотири речових типу: Single. Double. Extended і Real. Їх загальний формат однаковий:

Знак - це завжди один біт. Він дорівнює нулю для позитивних чисел і одиниці для негативних. Що ж стосується розмірів мантиси і експоненти, то саме в них і полягає відмінність між типами.

Перш ніж перейти до конкретних цифр, розглянемо докладніше тип Real, зробивши для цього невеликий екскурс в історію. Real - це стандартний тип мови Паскаль, який був присутній там з самого початку. Коли створювався Паскаль, процесори ще не мали вбудованої підтримки дійсних чисел, тому всі операції над цим типом зводилися до операцій з цілими числами. Відповідно, розмір полів в типі Real був підібраний так, щоб оптимізувати ці операції.

Мікропроцесор Intel 8086/88 і його поліпшені варіанти - 80286 і 80386 - також не мали апаратної підтримки дійсних чисел. Але системи на базі цих процесорів мали можливість підключення так званого співпроцесора. Ця мікросхема працювала з пам'яттю через шини центрального процесора і забезпечувала апаратну підтримку дійсних чисел. У системах середньої руки гніздо співпроцесора зазвичай було порожнім, так як це здешевлює систему (зрозуміло, вставити туди співпроцесор не було проблемою). Для кожного центрального процесора випускалися свої співпроцесори, маркованих Intel 8087, 80287 і 80387 відповідно. Були навіть співпроцесори, що випускаються іншими фірмами. Вони працювали швидше, ніж Intel'овской, але з'являлися на ринку пізніше. Тип дійсних чисел, підтримуваний сопроцессорами, не збігається з Real.

Щоб забезпечити в своїх системах підтримку сопроцессорних типів, Borland вводить в Turbo Pascal типи Single, Double і Extended. Extended - це рідний для співпроцесора тип, а типи Single і Double виходять з нього дуже простим урізанням. При завантаженні числа типу Single або Double у внутрішній регістр співпроцесора останній конвертує їх в Extended. Навпаки, під час вивантаження чисел цих типів з регістра в пам'ять співпроцесор усікає їх до потрібного розміру. Внутрішні ж операції завжди виконуються з даними типу Extended (втім, з цього правила є виняток, на якому ми зупинимося пізніше, після детального розгляду формату різних типів). Single і Double використовуються для економії пам'яті. Жоден з них також не збігається з типом Real. У системах з сопроцессорами нові типи обробляються помітно (в 2-3 рази) швидше, ніж Real (це з урахуванням того, що тип Real після відповідного перетворення також оброблявся співпроцесором; якщо ж порівнювати обробку типу Extended на машині з співпроцесором і Real на машині без співпроцесора, то там на окремих операціях досягалася різниця приблизно в 100 разів). Щоб програми з цими типами можна було виконувати і в системах без співпроцесора, була можливість підключати до них програмний емулятор співпроцесора. Обробка цих типів емулятором була повільніше, ніж обробка Real.

Починаючи з 486-ого процесора Intel бере курс на інтеграцію процесора і співпроцесора в одній мікросхемі. Відсоток браку в мікросхемах занадто великий, тому Intel йде на хитрість: якщо у мікросхеми шлюб тільки в сопроцессорной частини, то на цій мікросхемі пропалює перемички, що блокують співпроцесор, і мікросхема продається як процесор 80486SX, що не має вбудованого співпроцесора (на відміну від повноцінної версії, яку назвали 80486DX). Бували й зворотні ситуації, коли співпроцесор пошкоджень не мав, зате процесор був непрацездатний. Такі мікросхеми перетворювали в «співпроцесор 80487». Але це вже з області екзотики, і, наскільки мені відомо, до Росії цей співпроцесор не дійшов.

Процесор Pentium у всіх своїх варіантах мав вбудований співпроцесор. Таким чином, з приходом цього процесора тип Real став як би тягарем, а на передній план вийшли Single, Double і Extended. Щоб звести до мінімуму необхідні переробки програм, Borland ввела нову директиву компілятора:. За замовчуванням варто OFF, що означає відсутність повної сумісності. У цьому випадку тип Real в Delphi збігається з типом Double. Якщо ж сумісність включена, тип Real збігається зі своїм прообразом з Паскаля. Існує ще тип Real48, який завжди, незалежно від налаштувань, збігається зі старим Real. Далі в цій статті під словом "Real" я завжди буду мати на увазі старий тип. Зазначу, що все це з'явилося тільки в Delphi 4, в більш ранніх версіях тип Real48 був відсутній, а тип Real був завжди старим, шестібайтним.

Отже, тепер можна, нарешті, дістатися до розмірів полів.

Схожі статті