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

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

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


person meds    schedule 29.04.2009    source источник
comment
Тот факт, что ЦП является 64-битным, обычно означает, что ЦП имеет 64-битные регистры общего назначения (т. Е. Целые числа) и размер адреса памяти. Но это ничего не говорит о математике с плавающей запятой. Например, процессоры Intel IA-32 являются 32-разрядными, но они изначально поддерживают числа с плавающей запятой двойной точности.   -  person Roman Zavalov    schedule 26.11.2012
comment
Операция с плавающей запятой двойной точности может представлять больше чисел, чем с плавающей запятой одинарной точности. Вот хорошее прочтение о плавающей запятой с точки зрения программирования. levelup.gitconnected.com/   -  person rjhcnf    schedule 29.12.2020


Ответы (11)


Примечание. Nintendo 64 действительно имеет 64-разрядный процессор, однако:

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

Из Webopedia:

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

person VonC    schedule 29.04.2009
comment
Я знаю, что это из вашего источника, но мне не нравится предложение: термин двойная точность употребляется неправильно, потому что точность на самом деле не двойная. Одинарная и двойная точность в наши дни довольно универсально определены IEEE, и, как вы указываете, одинарная точность имеет 23 бита в дроби, а двойная - 52 бита - это в основном вдвое больше точности ... - person Carl Walsh; 21.07.2012
comment
@ZeroDivide '**' - это возведение в степень - person VonC; 28.08.2013
comment
@CarlWalsh 52/23! = 2, следовательно, это не двойная точность - person rfoo; 28.09.2013
comment
@johnson Дополнительные сведения о ненормализованных значениях см. в easy68k.com/paulrsm/6502/WOZFPPAK. TXT, а также в stackoverflow.com/a/28801033/6309 - person VonC; 09.12.2017
comment
@rfoo Если вы хотите быть педантичным, это не точно double, а 52/2 ›23, так что да, это удвоенная точность, просто двойная, а затем еще немного. - person JShorthouse; 08.11.2019
comment
Ссылка на источник для второй цитаты мертва, что, вероятно, так же хорошо, поскольку кажется, что она не очень хорошо написана. В контексте этой цитаты предложение «Дополнительные биты увеличивают не только точность, но и диапазон величин, которые могут быть представлены», по-видимому, подразумевает, что мы не можем одновременно удвоить точность и увеличить диапазон, тогда как на самом деле мы имеем < i> более чем удвоение точности. Я уверен, что автор знал это, и, вероятно, они имели в виду неправильное употребление слова, что двойная точность занижает фактическое улучшение представления. - person David K; 27.11.2019
comment
@DavidK Спасибо. Я восстановил ссылку. Вы упомянули отрывок из webopedia.com/TERM/D/double_precision.html, который еще не закончился. Вы можете отредактировать ответ, чтобы добавить / включить свой комментарий. - person VonC; 27.11.2019
comment
Если подумать, запись в Webopedia не так плоха, как я сказал. Это стоящая ссылка. По вашему приглашению я добавил одно предложение под ним, чтобы прояснить взаимосвязь двух форматов IEEE. Я не зацикливаюсь на точной формулировке. - person David K; 28.11.2019
comment
@DavidK Спасибо. Не стесняйтесь вернуться к этому ответу, если вам нужно добавить новый элемент. - person VonC; 28.11.2019

Я прочитал много ответов, но, кажется, никто не объясняет, откуда взялось слово double. Я помню очень хорошее объяснение, данное мне профессором университета несколько лет назад.

Вспоминая стиль ответа 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 < / sub>).

Очевидно, что удвоение 32 - это 64, но это слово пришло не из этого.

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

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

  • одинарная точность: log 10 (2 24), что составляет примерно 7-8 десятичных цифр.
  • двойная точность: log 10 (2 53), что составляет примерно 15–16 десятичных цифр.
person Alessandro    schedule 24.02.2017
comment
Благодарим за использование правильной нумерации бит (знак - 31-й и 63-й бит соответственно). - person Jack_Hu; 29.08.2020

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

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

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

person Charlie Martin    schedule 29.04.2009

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

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

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

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

Цитата @Alessandro здесь

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

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

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

person SimpleGuy    schedule 14.02.2018

Все объяснили очень подробно, и я ничего не мог добавить. Хотя я хотел бы объяснить это в Условиях непрофессионала или на простом АНГЛИЙСКОМ языке.

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. Эти дроби могут привести к огромной разнице в больших вычислениях.

person Asad    schedule 13.09.2019

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

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

person codekaizen    schedule 29.04.2009

Обычно арифметика с плавающей запятой одинарной точности имеет дело с 32-битными числами с плавающей запятой, тогда как двойная точность работает с 64-битными.

Количество битов с двойной точностью увеличивает максимальное значение, которое может быть сохранено, а также увеличивает точность (то есть количество значащих цифр).

person cletus    schedule 29.04.2009

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

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

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

person Alex    schedule 29.04.2009

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

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

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

Цитата @Alessandro здесь

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

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

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

person djbtalk    schedule 10.12.2018

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

person Abdullah Al Mamun    schedule 31.03.2018

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

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

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

person Community    schedule 01.05.2009