Яка різниця між операцією з плаваючою точкою з однією точністю і подвійною точністю?


169

Яка різниця між операцією з плаваючою точкою з однією точністю і плаваючою операцією подвійної точності?

Мене особливо цікавлять практичні терміни стосовно консолей відеоігор. Наприклад, чи має Nintendo 64 64-бітний процесор, і якщо це все-таки буде, це означає, що він був здатний до подвійної точності операцій з плаваючою точкою? Чи можуть PS3 та Xbox 360 зняти операції з плаваючою крапкою з подвійною точністю або лише одна точність і, як правило, використовуються можливості подвійної точності (якщо вони існують?).


17
Той факт, що CPU є 64-розрядним, зазвичай означає, що CPU має 64-бітні регістри загального призначення (тобто цілі числа) та розмір адреси пам'яті . Але це нічого не говорить про математику з плаваючою комою. Наприклад, процесори Intel IA-32 є 32-бітними, але вони в основному підтримують поплавки подвійної точності.
Роман Завалов

Відповіді:


215

Примітка. Однак Nintendo 64 має 64-розрядний процесор:

Багато ігор скористалися 32-бітним режимом обробки мікросхеми, оскільки більша точність даних, доступна для 64-бітових типів даних, зазвичай не потрібна для 3D-ігор, а також той факт, що обробка 64-бітних даних використовує вдвічі більше оперативної пам'яті, кешу та пропускну здатність, тим самим знижуючи загальну продуктивність системи.

З Вебопедії :

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

Додаткові біти збільшують не тільки точність, але і діапазон величин, який можна представити.
Точна кількість збільшення точності та діапазону величин залежить від того, який формат використовує програма для представлення значень з плаваючою комою.
Більшість комп'ютерів використовують стандартний формат, відомий як формат IEEE з плаваючою комою.

Формат подвійної точності IEEE насправді має більш ніж удвічі більше біт точності, ніж формат одноточної, а також набагато більший діапазон.

Зі стандарту IEEE для арифметики з плаваючою комою

Єдина точність

Стандартне представлення IEEE з однією точністю з плаваючою точкою вимагає 32-бітного слова, яке може бути представлене як пронумеровано від 0 до 31, зліва направо.

  • Перший біт - це бітовий знак , S,
  • наступні вісім біт - це біти експонента , "E" і
  • остаточні 23 біти є дробом "F":

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

Значення V, представлене словом, можна визначити наступним чином:

  • Якщо E = 255 і F ненульове, то V = NaN ("Не число")
  • Якщо E = 255 і F дорівнює нулю, а S дорівнює 1, то V = -нескінченність
  • Якщо E = 255 і F дорівнює нулю, а S дорівнює 0, то V = нескінченність
  • Якщо 0<E<255тоді, V=(-1)**S * 2 ** (E-127) * (1.F)де "1.F" призначений представляти двійкове число, створене префіксом F з неявним ведучим 1 і двійковою точкою.
  • Якщо E = 0 і F відмінна від нуля, то V=(-1)**S * 2 ** (-126) * (0.F). Це "ненормалізовані" значення.
  • Якщо E = 0 і F дорівнює нулю, а S дорівнює 1, то V = -0
  • Якщо E = 0 і F дорівнює нулю, а S дорівнює 0, то V = 0

Зокрема,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Подвійна точність

Стандартне подання з плаваючою крапкою IEEE з подвійною точністю вимагає 64-бітного слова, яке може бути представлене як пронумеровано від 0 до 63, зліва направо.

  • Перший біт - це бітовий знак , S,
  • наступні одинадцять біт - це біти експонента , "E" і
  • остаточні 52 біти є дробом 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

Значення V, представлене словом, можна визначити наступним чином:

  • Якщо E = 2047 і F ненульовий, то V = NaN ("Не число")
  • Якщо E = 2047 і F дорівнює нулю, а S дорівнює 1, то V = -нескінченність
  • Якщо E = 2047 і F дорівнює нулю, а S дорівнює 0, то V = нескінченність
  • Якщо 0<E<2047тоді, V=(-1)**S * 2 ** (E-1023) * (1.F)де "1.F" призначений представляти двійкове число, створене префіксом F з неявним ведучим 1 і двійковою точкою.
  • Якщо E = 0 і F ненульове, то V=(-1)**S * 2 ** (-1022) * (0.F)це "ненормалізовані" значення.
  • Якщо E = 0 і F дорівнює нулю, а S дорівнює 1, то V = -0
  • Якщо E = 0 і F дорівнює нулю, а S дорівнює 0, то V = 0

Довідка:
Стандарт 754-1985 ANSI / IEEE,
Стандарт для арифметики двійкових плаваючих точок.


9
Я знаю, що це з вашого джерела, але мені не подобається пропозиція: "Термін подвійна точність - це щось неправильне, тому що точність насправді не подвійна". Одинична та подвійна точність в наші дні досить універсально визначена IEEE, і як ви вказуєте, одна точність має 23 біти у фракції, а подвійна - 52 біти - це в основному подвійна точність ...
Карл Уолш

5
@ZeroDivide ' **' - Експонентація
VonC

11
@CarlWalsh 52/23! = 2 ерго, це не "подвійна точність"
rfoo

@johnson У вас є більш докладної інформація про ненормалізованих значеннях в easy68k.com/paulrsm/6502/WOZFPPAK.TXT , а також в stackoverflow.com/a/28801033/6309
VonC

2
@rfoo Якщо ви хочете бути впевненими в педантічності, це не зовсім подвійно, але 52/2> 23 так, так, це подвійна точність, це просто подвійна, а потім ще трохи.
JShorthouse

42

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

Згадуючи стиль відповіді VonC, в одному точному поданні з плаваючою точкою використовується слово 32 біт.

  • 1 біт для знака , S
  • 8 біт для експонента , "E"
  • 24 біта для фракції , також званої мантісою , або коефіцієнтом (навіть якщо представлено лише 23). Назвемо це "М" (для мантіси я вважаю за краще це ім'я, оскільки "дріб" можна неправильно зрозуміти).

Представництво:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Тільки щоб зазначити, біт знаків - останній, а не перший.)

У подвійній точності подання з плаваючою точкою використовується слово 64 біт.

  • 1 біт для знака , S
  • 11 біт для показника , "E"
  • 53 біта для коефіцієнта дробу / мантіси / коефіцієнта (хоча представлено лише 52), "M"

Представництво:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

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

  • 0,000124 стає 0,124 × 10 −3
  • 237.141 стає 0,237141 × 10 3

Це означає, що мантія завжди буде у формі

0.α 1 α 2 ... α t × β p

де β - основа представлення. Але оскільки дріб є двійковим числом, α 1 завжди буде дорівнює 1, тому дріб можна переписати як 1.α 2 α 3 ... α t + 1 × 2 p, а початковий 1 можна неявно припустити, звільнення місця для додаткового біта (α t + 1 ).

Тепер, очевидно, правда, що дубль 32 - це 64, але слово не походить від цього.

Точності вказує кількість десяткових цифр, які правильно , тобто без будь - яких помилок уявлення або наближення. Іншими словами, це вказує, скільки десяткових цифр можна сміливо використовувати.

З огляду на це, легко оцінити кількість десяткових цифр, які можна безпечно використовувати:

  • одинарна точність : log 10 (2 24 ), що становить приблизно 7 ~ 8 десяткових цифр
  • подвійна точність : log 10 (2 53 ), що становить приблизно 15 ~ 16 десяткових цифр

19

Гаразд, основна різниця в машині полягає в тому, що подвійна точність використовує вдвічі більше бітів, ніж одиничні. У звичайній реалізації це 32 біти для одинарних, 64 біт для подвійних.

Але що це означає ? Якщо припустити стандарт IEEE, то одне точне число має близько 23 біт мантіси, а максимальний показник - близько 38; подвійна точність має 52 біти для мантіси, а максимальна - близько 308.

Деталі містяться у Вікіпедії , як завжди.


11

Щоб додати тут всі чудові відповіді

Перш за все, float і double використовуються для представлення чисел дробовими числами. Отже, різниця між двома випливає з того, з якою точністю вони можуть зберігати числа.

Наприклад: я повинен зберігати 123.456789 Один може зберігати лише 123.4567, а інший може зберігати точний 123.456789.

Отже, в основному ми хочемо знати, наскільки точно може бути збережене число і це те, що ми називаємо точністю.

Цитуючи @Alessandro тут

Точність показує кількість правильних десяткових цифр , тобто без будь-якої помилки подання чи наближення. Іншими словами, це вказує, скільки десяткових цифр можна сміливо використовувати.

Поплавок може точно зберігати приблизно 7-8 цифр у дробовій частині, тоді як Double може точно зберігати близько 15-16 цифр у дробовій частині

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


7

Щодо питання "Чи можуть ps3 та xbxo 360 зняти операції з плаваючою точкою з подвійною точністю або лише одна точність та у використанні generel - це використана можливість подвійної точності (якщо вони існують?").

Я вважаю, що обидві платформи не здатні подвоїтися з плаваючою точкою. Оригінальний процесор Cell мав лише 32 бітні плавці, як і апаратне забезпечення ATI, на якому базується XBox 360 (R600). Пізніше Cell отримав подвійну підтримку з плаваючою комою, але я впевнений, що PS3 не використовує цю чіппері.


5

В основному одинарної точності з плаваючою комою арифметичних операцій з числами з плаваючою точкою 32 бітних , тоді як подвійний точності угод з 64 біт.

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


5

Всі вони пояснили дуже докладно, і нічого я не міг би додати далі. Хоча я хотів би пояснити це в Термінах Layman або звичайній англійській мові

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Змінна, здатна зберігати або представляти "1.9", забезпечує меншу точність, ніж та, яка вміє вміщувати або представляти 1,9999. Ці Дроби можуть становити величезну різницю у великих розрахунках.


2

Подвійна точність означає, що для зберігання чисел потрібно двічі довжини слова. У 32-бітному процесорі слова - це 32 біти, тому подвоєння - 64 біт. Що означає це з точки зору продуктивності, це те, що виконання операцій з подвійною точністю займає трохи більше часу. Таким чином, ви отримуєте кращий діапазон, але невеликий удар у продуктивності. Цей удар трохи пом’якшений апаратними одиницями з плаваючою точкою, але його все ще є.

N64 використовував NEC VR4300 на базі MIPS R4300i, який є 64-бітовим процесором, але процесор спілкується з рештою системи через 32-бітну шину. Отже, більшість розробників використовували 32-бітові номери, оскільки вони швидші, і більшість ігор на той час не потребували додаткової точності (тому вони використовували плаваючі не парні).

Усі три системи можуть виконувати операції з плаваючою операцією з одною та подвійною точністю, але це може бути не через продуктивність. (хоча майже все після n64 використовували 32-бітну шину, так що ...)


1

Перш за все, float і double використовуються для представлення чисел дробовими числами. Отже, різниця між двома випливає з того, з якою точністю вони можуть зберігати числа.

Наприклад: я повинен зберігати 123.456789 Один може зберігати лише 123.4567, а інший може зберігати точний 123.456789.

Отже, в основному ми хочемо знати, наскільки точно може бути збережене число і це те, що ми називаємо точністю.

Цитуючи @Alessandro тут

Точність показує кількість правильних десяткових цифр, тобто без будь-якої помилки подання чи наближення. Іншими словами, це вказує, скільки десяткових цифр можна сміливо використовувати.

Поплавок може точно зберігати приблизно 7-8 цифр у дробовій частині, тоді як Double може точно зберігати близько 15-16 цифр у дробовій частині

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


0

Відповідно до IEEE754 • Стандарт для зберігання з плаваючою точкою • 32 та 64 бітні стандарти (однакова та подвійна точність) • 8 та 11 бітний показник відповідно • Розширені формати (як мантіса, так і експонент) для проміжних результатів


-3

Одиничне число точності використовує 32 біти, при цьому MSB є бітовим знаком, тоді як число подвійної точності використовує 64 біт, MSB є бітовим знаком

Єдина точність

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Подвійна точність:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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