Чи може хтось пояснити подання поплавця в пам'яті?


20

Це не повторне запитання, коли я читав попереднє запитання.

Хто-небудь може мені допомогти в розумінні how float values are stored in the memory.

Я сумніваюсь, тут знаки float містять ' .'( for example 3.45), як '.'буде представлена ​​пам'ять у пам'яті?

Може хто-небудь, будь ласка, уточнив мене діаграмою?


21
Як щодо найменш очікуваного джерела, Вікіпедії? en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
І ви можете додати головну статтю: IEEE з плаваючою точкою
mouviciel

4
Якщо ви схожі на мене, і ви хочете дізнатися, граючи з речами, вкладаючи в входи і виходи прийому і т.д., перевірити цей сайт з: binaryconvert.com/convert_double.html
KChaloux

Існує широкий спектр форматів з плаваючою комою, всі різні. Плаваюча точка IEEE є найпоширенішою в наші дні, але вона не єдина. Коли я був недооціненим, мені довелося вивчити формат з плаваючою комою CDC 6600, і він мав деякі переваги перед IEEE, найбільший - 48 біт мантіси для одноточності. IEEE обмежений приблизно 24 бітами мантіси для одноточності, тому кожен вступний числовий метод класу в ці дні каже студентам "Завжди використовуйте подвійний, а не плаваючий".
Джон Р. Стром

Дивіться floating-point-gui.de і пам’ятайте, що URL
Базиле Старинкевич

Відповіді:


44

Десяткова крапка явно не зберігається ніде; це проблема з відображенням.

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

Почніть з подання значення з плаваючою комою у варіанті наукової нотації, використовуючи базу 2 замість основи 10. Наприклад, значення 3.14159 можна представити як

    0,7853975 * 2 2

0.7853975 - це значення , інакше мантиси; це частина числа, що містить значні цифри. Це значення множимо на базу 2, підняту на потужність 2, щоб отримати 3.14159.

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

Типовий 32-розрядний макет виглядає приблизно так:

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

Як і підписані цілі типи, біт високого порядку вказує знак; 0 вказує на додатне значення, 1 - на негативне.

Наступні 8 біт використовуються для експонента. Експоненти можуть бути позитивними або негативними, але замість того, щоб резервувати інший біт знаків, вони кодуються таким чином, що 10000000 представляє 0, тому 00000000 являє собою -128, а 11111111 являє 127.

Решта бітів використовуються для означенняі. Кожен біт представляє негативну силу 2 підрахунку зліва, так що:

    01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 
          = 0,25 + 0,125 + 0,03125 
          = 0.40625

Деякі платформи передбачають "прихований" провідний біт у значенніі завжди встановлений на 1, тому значення в значенні значень завжди знаходяться між [0,5, 1). Це дозволяє цим платформам зберігати значення з дещо більшою точністю (докладніше про це нижче). Мій приклад цього не робить.

Отже наше значення 3,14159 було б представлене як щось подібне

    0 10000010 11001001000011111100111
    ^ ^ ^
    | | |
    | | + --- значення та 0,7853975 ...
    | |
    | + ------------------- показник = 2 (130 - 128)
    |
    + ------------------------- знак = 0 (позитивний)

    значення = -1 (знак) * 2 (показник) * (означення)
    значення = -1 0 * 2 2 * 0.7853975 ...
    значення = 3,14159 ...

Тепер, що ви помітите, якщо ви додасте всі біти у знаменні, це те, що вони не становлять 0,7853975; вони фактично виходять на 0,78539747. Існує не зовсім достатньо бітів, щоб точно зберігати значення ; ми можемо зберігати лише наближення. Кількість бітів у значенніі визначає точність або скільки значущих цифр ви можете зберігати. 23 біт дає нам приблизно 6 десяткових цифр точності. 64-розрядні типи з плаваючою точкою пропонують достатньо бітів у значенніі, щоб дати приблизно 12-15 цифр точності. Але майте на увазі, що є цінності, які неможливо точно представити незалежно від того того, якбагато бітів ви використовуєте. Так само, як значення типу 1/3 не можуть бути представлені у кінцевій кількості десяткових цифр, значення типу 1/10 не можуть бути представлені у кінцевій кількості біт. Оскільки значення є приблизними, розрахунки з ними також приблизні, а помилки округлення накопичуються.

Кількість бітів в експоненті визначає діапазон (мінімальні та максимальні значення, які ви можете представити). Але в міру просування до мінімальних і максимальних значень розмір розриву між репрезентативними значеннями збільшується. Тобто, якщо ви не можете точно представити значення між 0.785397 і 0.785398, то ви не можете точно представляти значення між 7.85397 і 7.85398 або значеннями між 78.5397 і 78.5398, або значеннями між 785397.0 і 785398.0. Будьте обережні, множуючи дуже великі (за величиною) числа на дуже малі числа.


", але замість того, щоб резервувати ще один бітний знак", що ви описуєте, - це точна поведінка підписаного цілого числа.
Саймон

6

Це .зовсім не зберігається. По-перше, ви повинні зрозуміти інженерні позначення, у яких є коефіцієнт фіксованої точності та цілий показник: 11,0 · 10 0 = 1.0E0, 2 є 2.0E0, 10 і 1.0E1т. Д. Це дозволяє дуже коротко позначити великі числа. Один мільярд є 1.0E9. Коефіцієнт перед Eзазвичай нотірованних як фіксованою точністю номер: 1.00000E9. Результатом цього є те, що число один мільярд і один = 1 000 000,001 і один мільярд є однаковими в цій позначенні, коли точність недостатньо велика. Також зауважте, що фактор ніколи не потребує провідного нуля. Натомість показник можна зменшити до тих пір, поки це не відбудеться.

У пам'яті число з плаваючою комою представлено аналогічно: один біт має знак, деякі біти утворюють коефіцієнт як число з фіксованою точністю ("mantissa"), решта біти утворюють показник. Істотні відмінності від інженерних позначень base-10 полягають у тому, що, звичайно, зараз показник має базу 2. Точний розмір кожної деталі залежить від точного стандарту з плаваючою комою, який ви використовуєте.


3
Це "Наукова нотація". "Інженерна нотація" - це коли показник обмежений кратними 3.
Климент Дж.

7
Ця база 2 дуже важлива. Він визначає, які значення можна точно зберігати, а які ні, і навіть якщо ви не можете зайнятися розвитком інтуїції, для яких значень (я знаю, я не можу), ви повинні принаймні пам’ятати, що десяткові цифри абсолютно марні спосіб мислення про поплавці.

1
@delnan: Якщо це допомагає, кожен шматочок в мантісі наполовину менший від вищого біта. Отже, поплавці можуть зберігати суми негативних потужностей у два: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 тощо, до межі мантіси . Отже, епсилон в 32-бітномуfloat є 2^-22 * exponent, або приблизно 1/4194304.
greyfade
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.