Що таке що? · bei.pm
У цій рубриці ви знайдете статті про формати файлів та зворотне інженерування.
Але справа в тому:
Існує безліч мов програмування, і багато людей знають деякі речі під зовсім іншими назвами - або взагалі не мають уявлення про існування найосновніших понять, оскільки їхня мова програмування абстрагує їх від цього.
tl;dr:
Моя нотація приблизно орієнтується на C99 <stdint.h>
. Ті, хто розуміє цю нотацію, без сумніву, впораються з моєю нотацією.
Цілі числа
Цілі числа — це просто кажучи, цілі числа, тобто числа без дробової частини.
При цьому цілі числа у форматах даних зазвичай визначаються в межах фіксованого діапазону значень, своєрідної роздільної здатності. Я вказую це в бітах — з тієї причини, що "байт" та похідні типи (слово, подвійне слово тощо) зазвичай залежать від платформи.
Крім того, при типах цілих чисел також розрізняють натуральні числа (ℕ, тобто без знака - Unsigned) та цілі числа (ℤ, тобто зі знаком - Signed).
Ця інформація вказується за допомогою знака у позначенні (u
або s
).
Можливо, що цілі числа зі знаком можуть бути представлені або як одинарне доповнення, або як двійне доповнення.
Якщо не зазначено інакше, використовується двійне доповнення, оскільки воно є переважним представленням у сучасній інформатиці.
Беззнакові числа я вказую у своїх документаціях як uint
, з подальшим зазначенням точності в бітах.
З числами зі знаком я вказую у своїх документаціях як sint
, також з подальшим зазначенням точності в бітах.
Я відмовляюсь від використання типу даних "char" для символів, оскільки рядки зазвичай представляють лише послідовності цілих значень зі спеціальною інтерпретацією.
Тому їх представляють як uint(8)[].
Приклади:
Позначення | C99 stdint.h -еквівалент |
Опис | Діапазон значень |
---|---|---|---|
uint(16) | uint16_t | Беззнакове ціле число, довжина 16 біт | 0 - 65.535 |
sint(8) | int8_t | Знаковане ціле число, довжина 8 біт, двійковий комплемент | -126 - 127 |
uint(24) | uint32_t:24 | Беззнакове ціле число, довжина 24 біт | 0 - 16.777.216 |
Фіксовані значення
Фіксовані коми - це числові значення з спектра раціональних чисел (Q), які мають коми та десяткові знаки.
У фіксованих комах - тому й назва - позиція коми жорстко визначена типом даних.
Це також створює фіксований діапазон чисел для цього типу даних; математично виражено, числовий простір є кінцевим.
В реальності цей тип даних переважно використовується на платформах без достатньо швидкого апарату з плаваючою комою, оскільки обчислення фіксованих ком може виконуватися за допомогою цілочисельних блоків.
Цей тип даних також використовується, наприклад, системами управління базами даних, коли потрібно виконати фіксовані вимоги.
Згадаємо, наприклад, системи для постійного зберігання фінансових даних; більшість валют обмежуються 2 знаками після коми.
(Однак не розумно використовувати фіксовані коми для цього; розумніше замість цього зберігати безпосередньо найменшу валютну одиницю як ціле число, а залишок залишити для представлення)
Аналогічно цілочисельним значенням, я вказую розділ числа до і після коми:
ufixed(9,7)
позначає тип даних, який без знака резервує 9 біт для значення перед комою, а також 7 біт для значення після коми; загалом ширина становитиме 16 біт, що, наприклад, може охопити діапазон (0,0) до (511,127) як вектор з двох незалежних цілих чисел.
Однак ця інтерпретація в десятичному представленні не використовує 28 чисел, оскільки ймовірно, що в практиці обмежаться максимумом (511,99).
Замість прямої інтерпретації фіксованого значення як вектора з 2 окремих цілих чисел - що завжди означає невикористаний діапазон даних при перетворенні в десяткові числа та ручне перенесення - можна також інтерпретувати десятковий діапазон як дроб їх загальної роздільної здатності.
На прикладі згаданого ufixed(9,7)
отримаємо дріб з дільником 27 - числовий діапазон тоді буде від 0,00 до 511 + 126⁄127
Для перетворення в десяткове представлення десяткову частину необхідно поділити на 128.
З цією варіантом легше виконувати арифметичні операції, оскільки перенесення автоматично виникає, через що цей варіант зазвичай віддається перевага.
Однак цей варіант має недолік у тому, що десяткові знаки в десятковому представленні більше не мають гарантованої роздільної здатності, тому одна десяткова частина більше не має еквіваленту 0.01
, а має 0.007874
, що призведе до відповідних помилок округлення.
Який спосіб інтерпретації використовується, документується відповідно до місця використання.
Числа з плаваючою комою
Числові значення з плаваючою комою є математично складнішими виразами, у яких ціле число з фіксованою роздільною здатністю виражається через математичний термін так, що ефективно частина після коми формується шляхом зсуву - і таким чином безпосередньо орієнтується на наукову нотацію.
Найпоширеніший спосіб реалізації цього був стандартизований з
IEEE 754 і з тих пір міжнародно визнаний.
При цьому числове значення з плаваючою комою зазвичай складається з наступних компонентів:
Знак (0 або 1 ) |
Експонента | Мантиса |
Під час того, як знак може бути легко отриманий як двійкова інформація Так/Ні, сама числове значення формується через рівняння
Мантиса * 2Експонента
Додатково є ряд константних значень, що охоплюють особливі випадки раціональних чисел - серед них ±∞
та NaN
("немає дійсного числа").
Числові значення з плаваючою комою особливо корисні, коли точність не є такою важливою, оскільки в цьому типі значень неминуче виникають округлювальні помилки і, отже, втрата точності. Зазвичай числові значення з плаваючою комою використовуються, наприклад, для визначення координат, таких як вектори вершин у 3D-моделях або криві Безьє/Сплайн для оптичних репрезентацій.
В форматах даних числові значення з плаваючою комою зазначаються як float(Мантиса, Експонента)
.
Якщо використовується формат, що відрізняється від IEEE 754, це відповідно зазначається.