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

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

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

9 ответов


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

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

от Webopedia:

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

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

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

Один

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

  • Первый БИТ знак бит, S,
  • следующие восемь бит-это показатель bits, '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 с помощью неявное ведущее 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,
  • следующие одиннадцать бит-это показатель bits, '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 с помощью неявное ведущее 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, a один прецизионное представление с плавающей запятой использует слово из 32 бит.

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

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

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

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

A двойной представление с плавающей запятой точности использует слова 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 × 103

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

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

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

Теперь, очевидно, верно, что двойник 32 равен 64, но это не то, откуда взялось слово.

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

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

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

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

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

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


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

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


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

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

например: Я должен хранить 123.456789, один может хранить только 123.4567, а другой может хранить точное 123.456789.

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

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

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

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

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


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

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


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

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

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


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


одиночный номер точности использует 32 бита, с MSB быть битом знака, тогда как двойной номер точности использует 64bits, MSB быть битом знака Однократная точность-SEEEEEEEFFFFFFFFFFFFFFFFFFFFFF(ЗНАК + ПОКАЗАТЕЛЬ + ЗНАЧЕНИЕ) Двойной точности-SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(ЗНАК + ПОКАЗАТЕЛЬ + ЗНАК)