Чому представлення з плаваючою комою використовує біт знаків замість доповнення 2 для позначення негативних чисел


20

Розглянемо зображення фіксованої точки, яке може розглядатися як вироджений випадок плаваючого числа. Цілком можливо використовувати доповнення 2 для від’ємних чисел. Але чому біт знаків необхідний для чисел з плаваючою точкою, не слід, щоб біти мантіси використовували доповнення 2?

Крім того, чому біти експонента використовують зміщення замість представленої величини (як аналогічно бітам мантіси) або представлення 2 комплементу?

Оновлення: Вибачте, якщо я не дав зрозуміти. Я шукав причину того, як формується подання з плаваючою точкою. Якщо між альтернативами не існує сильної компромісії щодо впровадження, то хтось може пояснити історичні аспекти представлення плаваючої точки?

Відповіді:


7

Доповнення двох має сенс, коли ці дві сутності мають однакові "одиниці" та однакову "ширину". Під шириною я маю на увазі, що, скажімо, якщо ви додаєте N бітове число і M бітове число, де N і M різні, то вам краще не використовувати два доповнення. Для чисел з плаваючою комою ми маємо проблему одиниць: якщо експоненти різні, то ми подумки зміщуємо одну з мантіс, і зараз ми з тією ж проблемою, що і раніше (з шириною).

Що стосується бітів експонента, то, використовуючи зміщення замість знака + величини, ми отримуємо ще одне значення (інакше у нас було б +0 і -0). Тут доповнення двох має сенс при множенні чи діленні чисел (з тих пір ми додаємо або віднімаємо експоненти), але не так багато сенсу при додаванні чи відніманні.

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


4
"Якщо ви додаєте N бітове число і M бітове число, де N і M різні, то вам краще не використовувати доповнення двох" - Чи можете ви трохи уточнити? Я вважаю, що цілком можливо підписати розширення числа за допомогою представлення доповнення 2 за допомогою MSB, наприклад, 4'b1111 пошириться на 5'b11111, а 4'b0111 -> 5'b00111. Чи не слід додати це до існуючого перемикача стовбура в арифметичній логіці з плаваючою точкою?
коо

Спасибі за вашу відповідь! Я відредагував це питання, щоб воно чіткіше запитувало, що робить поточну плаваючу крапку.
коо

4

З Вікіпедії:

Система доповнення двох має перевагу в тому, що основні арифметичні операції додавання, віднімання та множення ідентичні операціям для безпідписаних двійкових чисел ...

Доповнення двох - це подання від'ємних чисел, що саме так буває дуже зручним. У цьому вся причина, коли його взагалі використовувати.

Пара мантіси-експонента - це зображення числа з плаваючою точкою. Більшу частину часу, використовуючи числа з плаваючою комою, ви не займаєтеся арифметикою виключно на мантісі або виключно на експоненті.


4

Але чому для знаків з плаваючою комою необхідний бітовий знак

Неправдиве припущення. Це не обов'язково. Я впевнений, що я зустрічав формати з плаваючою комою, які використовували доповнення 2 для мантіси, але мені доведеться розкопати імена.

Я далеко не фахівець з числового аналізу, але розумію, що підписавши нуль, для них важливо. Це, мабуть, простіше маніпулювати, ніж доповнювати їх. Це, мабуть, був критерієм при виборі IEEE-754.

Крім того, чому біти експонентів використовують зміщення замість представленої величини

Знову ж таки, щось не потрібно, а дехто зробив щось по-іншому.

Це представлення, для якого простіше зробити апаратну реалізацію для набору операцій, які виконуються на експонентах (і тут представлення для -0 не хочеться).

Одним із наслідків цього вибору є те, що ви можете використовувати підписане цілочисельне порівняння для порівняння номера FP, якщо вам не байдуже NaN, що, можливо, було критерієм для деяких (факт, ніж NaN потребує спеціального поводження, змушує мене сумніватися, що це не було для IEEE-754).


Підписані цілі порівняння віднесуть негативні числа FP назад. Для їх правильного ранжирування необхідний був би якийсь формат доповнення, мабуть, найкращим буде доповнення (негативний - 110.1111 ..., з нескінченними ліворуч та праворуч).
supercat

3
MIL-STD-1750A - це, мабуть, найбільш широко використовувана архітектура процесора, яка визначає доповнення двох з плаваючою комою. У розділі 4.1: "Набір інструкцій повинен підтримувати 16-бітну фіксовану точку з одноточною точністю, 32-бітну подвійну точність з фіксованою точкою, 32-бітну плаваючу точку та 48-бітну плаваючу точку з розширеною точністю у додатковому поданні 2". (Наголос мій) .
njuffa

2

IEEE 754 використовує знак / величину, а не два доповнення чи доповнення.

Додаток двох має той недолік, що позитивний і негативний діапазон не є тотожними. Якщо всі бітові шаблони дійсні, у вас є числа x, де ви не можете легко обчислити -x. Це погано. Альтернативою є те, що є недійсні бітові шаблони, що також погано. У IEEE 754 немає недійсних бітових моделей для 64 або 32 бітної плаваючої точки, тому вам не потрібно турбуватися про це.

Доповнення людини зробить множення / поділ складнішим (з підписаною величиною ви просто впорядковуєте знаки і трактуєте мантію як безпідписане число). Для додавання і віднімання, я дійсно не хочу думати про додавання і віднімання в доповненнях, це болить голова.


Перший абзац цієї відповіді говорить про відсутність недоліків у підписанні / масштабі. Знак / величина має +/- 0 і більш складну арифметику, ніж доповнення двох.
Праксеоліт

Наявність +/- нуля - це і проблема, і особливість. Наприклад, ділення крихітного числа x на 10 ^ 100 дасть +0 або -0, зберігши знак x.
gnasher729

1

Підписання нулів надає підвищеної виразності, що може бути корисним для чисельних обчислень. На сторінці вікіпедії " Підписано нуль " зазначено:

Стверджується, що включення підписаного нуля в IEEE 754 значно полегшує досягнення чисельної точності в деяких критичних завданнях , зокрема при обчисленні складних елементарних функцій .

Один з головних конструкторів IEEE 754 з плаваючою точкою, WH Kahan є прихильником підписаного нуля з цих причин. Його думка, ймовірно, матиме велику вагу.


1

Я думаю, що важливо розуміти, що обчислення з плаваючою комою дають приблизні значення, а не точні значення. Тобто, якщо обчислення з плаваючою комою дає кодоване значення X, то це являє собою теоретично ідеальне значення, яке майже напевно НЕ X, але знаходиться в діапазоні [X .. X + e) ​​{де 'e' є ' машина epsilon ', тобто немає числа з плаваючою комою між X і X + e}. Більш конкретно, нуль з плаваючою комою представляє ідеальне число, яке, мабуть, не є абсолютно нульовим, але яке занадто мало, щоб представляти з ненульовим кодованим значенням з плаваючою комою.

Зважаючи на те, що використання представлення знаків і величин - це спосіб, що дозволяє кодуванню «запам'ятати» точно, на якій стороні нуля знаходиться ідеальне значення, позитивне чи негативне. Це критично важливо для певних складних (у значенні "a + bi") обчислень - складні> складні функції часто "багатозначні", тому для правильного обчислення важливо звернути увагу на місця "розрізів гілок". Зазначені нулі тоді в певному сенсі відзначають місця розташування цих розрізів гілок - обчислення, зроблені на позитивній стороні, будуть відрізнятися від тих, що на негативній.


1
Розрахунки з плаваючою комою дають точні значення. Вони лише трохи відрізняються від значень, які отримують математичні реальні числа. Число з плаваючою комою представляє одне число, а не діапазон.
gnasher729

0

Більшість форматів з плаваючою комою користуються тим фактом, що в двійковій системі будь-яке ненульове значення з не мінімальним показником матиме «1» як найбільш значущий біт мантіси. Таким чином, в системі з 23-бітовим полем для мантіси мантіси позитивних чисел не варіюються від 0 до 8388607, а натомість від 8,388,608 до 16,777,215. Мантіси чисел, які можуть бути або не бути позитивними, коливаються від -16,777,215 до -8,388,608 і від +8,388,608 до +16,777,215. Хоча два доповнення є найкращим числовим форматом, коли необхідно, щоб обчислення "плавно" перетинали нуль, переривчасті діапазони значень мантіси означають, що обчислення не зможуть нормально працювати через нуль, використовуючи вони два доповнення чи щось інше .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.