В чем разница между операциями с плавающей запятой одинарной и двойной точности?
В чем разница между операцией с плавающей запятой одинарной точности и операцией с плавающей запятой двойной точности?
Меня особенно интересуют практические термины в отношении игровых приставок. Например, есть ли в Nintendo 64 64-битный процессор и означает ли это, что он способен выполнять операции с плавающей запятой двойной точности? Могут ли PS3 и Xbox 360 выполнять операции с плавающей запятой двойной точности или только одинарную точность, и в общем случае используются возможности двойной точности (если они существуют?).
10 ответов
Примечание: Nintendo 64 имеет 64-битный процессор, однако:
Во многих играх использовался 32-битный режим обработки чипа, поскольку для 3D-игр обычно не требуется большая точность данных, доступная для 64-битных типов данных, а также тот факт, что для обработки 64-битных данных требуется вдвое больше оперативной памяти и кэш-памяти. и пропускная способность, тем самым снижая общую производительность системы.
Из Вебопедии:
Термин двойная точность является чем-то неправильным, потому что точность на самом деле не двойная.
Слово double происходит от того факта, что число с двойной точностью использует вдвое больше битов, чем обычное число с плавающей запятой.
Например, если число с одинарной точностью требует 32 бита, его аналог с двойной точностью будет иметь длину 64 бита.Дополнительные биты увеличивают не только точность, но и диапазон величин, которые могут быть представлены.
Точная величина, на которую увеличивается точность и диапазон величин, зависит от того, какой формат использует программа для представления значений с плавающей запятой.
Большинство компьютеров используют стандартный формат, известный как формат 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, в представлении с плавающей запятой одинарной точности используется слово 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 × 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 бита для двойного.
Но что это значит? Если мы примем стандарт IEEE, то число с одинарной точностью имеет около 23 битов мантиссы и максимальный показатель степени около 38; двойная точность имеет 52 бита для мантиссы и максимальный показатель около 308.
Подробности в Википедии, как обычно.
Чтобы добавить ко всем замечательным ответам здесь
Прежде всего, float и double оба используются для представления чисел дробных чисел. Таким образом, разница между этими двумя факторами связана с тем, насколько точно они могут хранить числа.
Например: я должен хранить 123,456789 Один может хранить только 123,4567, в то время как другой может хранить точные 123,456789.
Итак, в основном мы хотим знать, насколько точно может быть сохранено число и что мы называем точностью.
Цитируя @Alessandro здесь
Точность указывает количество правильных десятичных цифр, то есть без каких-либо ошибок представления или аппроксимации. Другими словами, это указывает, сколько десятичных цифр можно безопасно использовать.
Float может точно хранить около 7-8 цифр в дробной части, в то время как Double может точно хранить около 15-16 цифр в дробной части
Таким образом, float может хранить вдвое больше дробной части. Именно поэтому Double называется double the float
Все объяснили очень подробно, и я не мог ничего добавить. Хотя я хотел бы объяснить это в Условиях непрофессионала или на простом АНГЛИЙСКОМ языке
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. Эти дроби могут привести к огромной разнице в больших вычислениях.
В основном, арифметика с плавающей запятой одинарной точности имеет дело с 32-битными числами с плавающей запятой, тогда как двойная точность имеет дело с 64-битными.
Количество бит с двойной точностью увеличивает максимальное значение, которое может быть сохранено, а также увеличивает точность (то есть количество значащих цифр).
Что касается вопроса: "Могут ли ps3 и xbxo 360 выполнять операции с плавающей запятой двойной точности или только одинарную точность, и в общем случае используются возможности двойной точности (если они существуют?)".
Я считаю, что обе платформы неспособны к двойной плавающей запятой. Оригинальный процессор Cell имел только 32-разрядные числа с плавающей запятой, то же самое с аппаратным обеспечением ATI, на котором основан XBox 360 (R600). Позже Cell получил двойную поддержку с плавающей запятой, но я уверен, что PS3 не использует этот чип.
Двойная точность означает, что для хранения чисел требуется вдвое больше длины слова. На 32-битном процессоре все слова 32-битные, поэтому двойные 64-битные. С точки зрения производительности это означает, что операции с числами двойной точности выполняются немного дольше. Таким образом, вы получаете лучший диапазон, но это незначительно сказывается на производительности. Этот хит немного смягчается аппаратными модулями с плавающей запятой, но он все еще там.
В N64 использовался процессор NEC VR4300 на базе MIPS R4300i, представляющий собой 64-разрядный процессор, но процессор взаимодействует с остальной частью системы по 32-разрядной шине. Итак, большинство разработчиков использовали 32-битные числа, потому что они быстрее, и большинству игр в то время не требовалась дополнительная точность (поэтому они использовали числа с плавающей точкой, а не двойные).
Все три системы могут выполнять операции с плавающей запятой одинарной и двойной точности, но не из-за производительности. (хотя почти все после n64 использовало 32-битную шину, так что...)
Прежде всего, float и double оба используются для представления чисел дробными числами. Таким образом, разница между этими двумя факторами связана с тем, насколько точно они могут хранить числа.
Например: я должен хранить 123,456789 Один может хранить только 123,4567, в то время как другой может хранить точные 123,456789.
Итак, в основном мы хотим знать, насколько точно может быть сохранено число, и что мы называем точностью.
Цитируя @Alessandro здесь
Точность указывает количество правильных десятичных цифр, т.е. без каких-либо ошибок представления или аппроксимации. Другими словами, это указывает, сколько десятичных цифр можно безопасно использовать.
Float может точно хранить около 7-8 цифр в дробной части, в то время как Double может точно хранить около 15-16 цифр в дробной части
Таким образом, double может хранить вдвое больше дробной части, чем float. Именно поэтому Double называется double the float
В соответствии с IEEE754 • Стандарт для хранения с плавающей запятой • 32- и 64-битные стандарты (одинарная и двойная точность) • Экспоненты 8 и 11 бит соответственно • Расширенные форматы (как мантисса, так и экспонента) для промежуточных результатов
Число с одинарной точностью использует 32 бита, MSB - знаковый бит, а число с двойной точностью - 64 бита, MSB - знаковый бит
Одинарная точность
SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)
Двойная точность:
SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)