Десяткова крапка явно не зберігається ніде; це проблема з відображенням.
Наступне пояснення - це спрощення; Я залишаю безліч важливих деталей, і мої приклади не мають на меті представляти жодної реальної платформи. Це повинно дати вам смак того, як представлені в пам'яті значення з плаваючою комою та пов'язані з ними проблеми, але ви хочете знайти більш авторитетні джерела, такі як те, що повинен знати кожен арифметик з плаваючою точкою .
Почніть з подання значення з плаваючою комою у варіанті наукової нотації, використовуючи базу 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. Будьте обережні, множуючи дуже великі (за величиною) числа на дуже малі числа.