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

StackOverflow https://stackoverflow.com/questions/801117

Вопрос

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

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

Это было полезно?

Решение

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

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

От Вебопедия:

Термин «двойная точность» употребляется неправильно, потому что точность на самом деле не двойная.
Слово double происходит от того факта, что число двойной точности использует в два раза больше битов, чем обычное число с плавающей запятой.
Например, если для числа одинарной точности требуется 32 бита, его аналог двойной точности будет иметь длину 64 бита.

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

Из Стандарт IEEE для арифметики с плавающей запятой

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

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

  • Первый бит — это знак немного, С,
  • следующие восемь битов — это показатель степени биты, 'E' и
  • последние 23 бита — это доля 'Ф':

    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 слева направо.

  • Первый бит — это знак немного, С,
  • следующие одиннадцать битов показатель степени биты, 'E' и
  • последние 52 бита — это доля 'Ф':

    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.

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

Другие советы

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

Вспоминая стиль ответа VonC, одинокий Точное представление с плавающей запятой использует 32-битное слово.

  • 1 бит для знак, С
  • 8 бит для показатель степени, 'Е'
  • 24 бита для доля, также называемый мантисса, или коэффициент (хотя представлено всего 23).Назовем его «М» (от мантисса, я предпочитаю это название, так как «дробь» может быть неправильно понята).

Представление:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Просто отметим, что знаковый бит является последним, а не первым.)

А двойной Точное представление с плавающей запятой использует слово длиной 64 бита.

  • 1 бит для знак, С
  • 11 бит для показатель степени, 'Е'
  • 53 бита для доля / мантисса / коэффициент (хотя представлено только 52), «М»

Представление:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Как вы могли заметить, я написал, что мантисса в обоих типах содержит на один бит больше информации по сравнению с ее представлением.Фактически, мантисса — это число, представленное без всех его несущественных значений. 0.Например,

  • 0,000124 становится 0,124 × 10−3
  • 237,141 становится 0,237141 × 103

Это означает, что мантисса всегда будет иметь вид

0.α1α2...αт × βп

где β — база представления.Но поскольку дробь — двоичное число, α1 всегда будет равно 1, поэтому дробь можно переписать как 1.α2α3...αт+1 × 2п и можно неявно принять начальную 1, освобождая место для дополнительного бита (αт+1).

Очевидно, что двойное число 32 равно 64, но это слово пошло не отсюда.

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

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

  • одинарная точность:бревно10(224), что составляет около 7–8 десятичных цифр.
  • двойная точность:бревно10(253), что составляет около 15–16 десятичных цифр.

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

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

Подробности на Википедия, по-прежнему.

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

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

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

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

Цитирую @Алессандро здесь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитирую @Алессандро здесь

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

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

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

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

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

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top