В чем разница между операциями с плавающей запятой одинарной и двойной точности? - PullRequest
136 голосов
/ 29 апреля 2009

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

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

Ответы [ 10 ]

186 голосов
/ 29 апреля 2009

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

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

С Webopedia :

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

27 голосов
/ 24 февраля 2017

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

Ссылаясь на стиль ответа VonC, точное представление с плавающей запятой single использует слово 32 бита.

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

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

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

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

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

  • 1 бит для знака , S
  • 11 бит для показателя , 'E'
  • 53 бита для дроби / мантиссы / коэффициента (даже если представлено только 52), 'M'

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

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Как вы можете заметить, я писал, что mantissa имеет в обоих типах на один бит больше информации по сравнению с ее представлением. На самом деле, мантисса - это число, представленное без всего его несущественного значения 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 десятичных цифр
16 голосов
/ 29 апреля 2009

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

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

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

8 голосов
/ 14 февраля 2018

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

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

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

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

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

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

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

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

6 голосов
/ 29 апреля 2009

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

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

4 голосов
/ 29 апреля 2009

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

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

1 голос
/ 29 апреля 2009

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

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

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

0 голосов
/ 10 декабря 2018

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

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

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

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

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

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

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

0 голосов
/ 31 марта 2018

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

0 голосов
/ 01 мая 2009

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

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

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

...