Який діапазон чисел можна представити в 16-, 32- та 64-розрядних системах IEEE-754?


76

Я трохи знаю про те, як представлені числа з плаваючою комою, але, боюся, недостатньо.

Загальне питання:

Для заданої точності (для моїх цілей кількість точних десяткових знаків у базі 10), який діапазон чисел може бути представлений для 16-, 32- та 64-розрядних систем IEEE-754?

Зокрема, мене цікавить лише діапазон 16-розрядних та 32-розрядних чисел з точністю до +/- 0,5 (місце одиниць) або +/- 0,0005 (місце тисяч).


5
@bendin: Так, воно існує. en.wikipedia.org/wiki/Half_precision_floating-point_format
dan04


1
@bendin існує навіть 8-бітний або менше float, який часто викладається в навчальній програмі з інформатики. Він також використовується в ARM-кодуванні без введення . 10, 11, 14-бітові плаваючі також існують
phuclv

Відповіді:


104

Для даного IEEE-754 число з плаваючою комою X , якщо

2^E <= abs(X) < 2^(E+1)

тоді відстань від X до наступного найбільшого репрезентативного числа з плаваючою комою ( епсилон ) становить:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Наведені вище рівняння дозволяють обчислити наступне:

  • Для напівточності ...

    Якщо вам потрібна точність +/- 0,5 (або 2 ^ -1), максимальним розміром, який може бути число, є 2 ^ 10. Будь-яке більше цього і відстань між числами з плаваючою точкою перевищує 0,5.

    Якщо вам потрібна точність +/- 0,0005 (приблизно 2 ^ -11), максимальний розмір числа може бути 1. Будь-який більший за цей, і відстань між числами з плаваючою точкою перевищує 0,0005.

  • Для одинарної точності ...

    Якщо вам потрібна точність +/- 0,5 (або 2 ^ -1), максимальним розміром, який може бути число, є 2 ^ 23. Будь-яке більше цього і відстань між числами з плаваючою точкою перевищує 0,5.

    Якщо вам потрібна точність +/- 0,0005 (приблизно 2 ^ -11), максимальним розміром, який може бути число, є 2 ^ 13. Будь-яке більше цього і відстань між числами з плаваючою точкою перевищує 0,0005.

  • Для подвійної точності ...

    Якщо вам потрібна точність +/- 0,5 (або 2 ^ -1), максимальним розміром, який може бути число, є 2 ^ 52. Будь-яке більше цього і відстань між числами з плаваючою точкою перевищує 0,5.

    Якщо вам потрібна точність +/- 0,0005 (приблизно 2 ^ -11), максимальний розмір, який може бути число, становить 2 ^ 42. Будь-яке більше цього і відстань між числами з плаваючою точкою перевищує 0,0005.


3
Що стосується метрів, це означає, що при точності 1м і 1мм відповідно, напівточність дозволяє 1км і 1м, одинарна точність - 8мм і 8км, а подвійна точність - 4Пм і 4Тм.
Аарон Франке,

22

Для цілих чисел із плаваючою комою (я дам свою відповідь з точки зору подвійної точності IEEE), кожне ціле число від 1 до 2 ^ 53 є точно репрезентативним. Понад 2 ^ 53, цілі числа, які є точно репрезентабельними, віддаляються між собою збільшенням степенів двох. Наприклад:

  • Кожне 2-е ціле число від 2 ^ 53 + 2 до 2 ^ 54 може бути точно представлене.
  • Кожне 4-те ціле число від 2 ^ 54 + 4 до 2 ^ 55 може бути точно представлене.
  • Кожне восьме ціле число від 2 ^ 55 + 8 до 2 ^ 56 може бути точно представлене.
  • Кожне 16-те ціле число від 2 ^ 56 + 16 до 2 ^ 57 може бути точно представлене.
  • Кожне 32-е ціле число від 2 ^ 57 + 32 до 2 ^ 58 може бути точно представлене.
  • Кожне 64-те ціле число від 2 ^ 58 + 64 до 2 ^ 59 може бути точно представлене.
  • Кожне 128-е ціле число від 2 ^ 59 + 128 до 2 ^ 60 може бути точно представлене.
  • Кожне 256-е ціле число від 2 ^ 60 + 256 до 2 ^ 61 може бути точно представлене.
  • Кожне 512-е ціле число від 2 ^ 61 + 512 до 2 ^ 62 може бути точно представлене. . . .

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


19

Точність, наведена у посиланні Пітера Р на посилання MSDN, ймовірно, є правильним принципом, але, звичайно, реальність є більш складною.

Той факт, що "точка" в "плаваючій точці" є двійковою точкою, а не десятковою комою, може перемогти нашу інтуїцію. Класичний приклад - 0,1, для якого потрібна точність лише однієї цифри в десятковій, але взагалі не може бути представлена ​​точно в двійковій системі.

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


5

По-перше, ні IEEE-754-2008, ні -1985 не мають 16-бітових плаваючих знаків; але це пропоноване додавання з 5-розрядним показником та 10-розрядним дробом. IEE-754 використовує виділений знаковий біт, тому позитивний і негативний діапазон однакові. Крім того, дріб має передбачуваний 1 спереду, тому ви отримаєте додатковий біт.

Якщо вам потрібна точність до одного місця, як у випадку, коли ви можете представити кожне ціле число, відповідь досить проста: показник ступеня зміщує десяткову крапку в правий кінець дробу. Отже, 10-бітна частка дає вам ± 2 11 .

Якщо ви хочете один біт після десяткової коми, ви відмовляєтесь від одного біта перед ним, тож у вас буде ± 2 10 .

Одноточна точність має 23-бітову частку, тому у вас буде ± 2 24 цілих числа.

Скільки бітів точності потрібно після десяткової коми, повністю залежить від обчислень, які ви робите, і скільки ви робите.

  • 2 10 = 1024
  • 2 11 = 2048
  • 2 23 = 8 388 608
  • 2 24 = 16 777 216
  • 2 53 = 9 007 199 254 740 992 (подвійна точність)
  • 2 113 = 10 384 593 717 069 655 257 059 992 658 442 192 (квадратична точність)

Дивитися також


2

Див. IEEE 754-1985 :

v = (-1) ^ знак * s ^ (експонента-експонента_біас) * (1 + дріб)

Примітка (1 + дріб). Як зазначає @bendin , використовуючи двійкові числа з плаваючою комою, ви не можете виражати прості десяткові значення, такі як 0,1. Наслідком є ​​те, що ви можете вводити помилки округлення, роблячи прості доповнення багато разів або викликаючи такі речі, як усічення. Якщо вас цікавить якась точність, єдиним способом її досягнення є використання десяткової точки з фіксованою крапкою, яка в основному є масштабованим цілим числом.


0

Якщо я правильно розумію ваше запитання, це залежить від вашої мови.
Щодо C #, перегляньте посилання MSDN . Поплавок має точність 7 цифр і подвійну точність 15-16 цифр.


7
Насправді IEEE-754 визначає точність, тому вона не повинна бути мовною.
derobert

0

Мені знадобився досить довгий час, щоб зрозуміти, що, використовуючи подвійні в Java, я не втрачав значної точності в обчисленнях. плаваюча точка насправді має дуже хорошу здатність представляти числа з цілком розумною точністю. Точність, яку я втрачав, була відразу після перетворення десяткових чисел, набраних користувачами, у двійкове представлення з плаваючою комою, яке підтримується вбудованим способом. Нещодавно я почав перетворювати всі свої номери у BigDecimal. BigDecimal - це набагато більше роботи, щоб мати справу з кодом, ніж floats або double, оскільки це не один з примітивних типів. Але з іншого боку, я зможу точно представляти цифри, які вводять користувачі.

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