В чем разница между операциями с плавающей запятой одинарной и двойной точности?

169

В чем разница между операцией с плавающей запятой одинарной точности и операцией с плавающей запятой двойной точности?

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

tweetypi
источник
17
Тот факт, что ЦП является 64-разрядным, обычно означает, что ЦП имеет 64-разрядные регистры общего назначения (т.е. целые числа) и размер адреса памяти . Но это ничего не говорит о математике с плавающей точкой. Например, процессоры Intel IA-32 являются 32-разрядными, но они изначально поддерживают операции с плавающей запятой двойной точности.
Роман Завалов

Ответы:

215

Примечание: Nintendo 64 имеет 64-битный процессор, однако:

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

Из Вебопедии :

Термин «двойная точность» является чем-то неправильным, потому что точность на самом деле не двойная.
Слово double происходит от того факта, что число с двойной точностью использует вдвое больше бит, чем обычное число с плавающей запятой.
Например, если число с одинарной точностью требует 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 = -Infinity
  • Если 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 = -Infinity
  • Если 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

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

VonC
источник
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 десятичных цифр
Alessandro
источник
19

Хорошо, основное различие в машине состоит в том, что двойная точность использует вдвое больше бит, чем один. В обычной реализации это 32 бита для одного, 64 бита для двойного.

Но что это значит ? Если мы примем стандарт IEEE, то число с одинарной точностью имеет около 23 битов мантиссы и максимальный показатель степени около 38; двойная точность имеет 52 бита для мантиссы и максимальный показатель около 308.

Подробности в Википедии , как обычно.

Чарли Мартин
источник
11

Чтобы добавить ко всем замечательным ответам здесь

Прежде всего float и double оба используются для представления чисел дробных чисел. Итак, разница между этими двумя факторами связана с тем, насколько точно они могут хранить числа.

Например: я должен хранить 123,456789 Один может хранить только 123,4567, в то время как другой может хранить точные 123,456789.

Итак, в основном мы хотим знать, насколько точно может быть сохранено число и что мы называем точностью.

Цитируя @Alessandro здесь

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

Float может точно хранить около 7-8 цифр в дробной части, в то время как Double может точно хранить около 15-16 цифр в дробной части

Таким образом, float может хранить вдвое больше дробной части. Вот почему Double называется двойной поплавок

SimpleGuy
источник
7

Что касается вопроса: «Могут ли ps3 и xbxo 360 выполнять операции с плавающей запятой двойной точности или только одинарную точность, и в общем случае используются возможности двойной точности (если они существуют?)».

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

codekaizen
источник
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 использовался MECS R4300i на базе NEC VR4300, который представляет собой 64-битный процессор, но процессор взаимодействует с остальной частью системы по 32-разрядной шине. Таким образом, большинство разработчиков использовали 32-битные числа, потому что они быстрее, и большинство игр в то время не нуждались в дополнительной точности (поэтому они использовали числа с плавающей точкой, а не двойные).

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

Alex
источник
1

Прежде всего float и double оба используются для представления чисел дробных чисел. Итак, разница между этими двумя факторами связана с тем, насколько точно они могут хранить числа.

Например: я должен хранить 123,456789 Один может хранить только 123,4567, в то время как другой может хранить точные 123,456789.

Итак, в основном мы хотим знать, насколько точно может быть сохранено число и что мы называем точностью.

Цитируя @Alessandro здесь

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

Float может точно хранить около 7-8 цифр в дробной части, в то время как Double может точно хранить около 15-16 цифр в дробной части

Таким образом, double может хранить вдвое больше дробной части, чем float. Именно поэтому Double называется double the float

djbtalk
источник
0

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

Абдулла Аль Мамун
источник
-3

Число с одинарной точностью использует 32 бита, MSB - знаковый бит, а число с двойной точностью - 64 бита, MSB - знаковый бит

Одинарная точность

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Двойная точность:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Стив Беннетт
источник