Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Формат с плавающей запятой двойной точности (иногда называемый FP64 или float64 ) - это формат компьютерных чисел , обычно занимающий 64 бита в компьютерной памяти; он представляет широкий динамический диапазон числовых значений с использованием точки с плавающей запятой .

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

В IEEE 754-2008 стандарт , формат 64-битная база-2 официально называется binary64 ; в IEEE 754-1985 он назывался двойным . IEEE 754 определяет дополнительные форматы с плавающей запятой, включая 32-битные представления с основанием 2 одинарной точности и, в последнее время, представления с основанием 10.

Одним из первых языков программирования, предоставивших типы данных с плавающей запятой одинарной и двойной точности, был Фортран . До широкого принятия IEEE 754-1985 представление и свойства типов данных с плавающей запятой зависели от производителя компьютера и модели компьютера, а также от решений, принимаемых разработчиками языка программирования. Например, тип данных двойной точности GW-BASIC был 64-битным форматом с плавающей запятой MBF .

Двоичный формат с плавающей запятой двойной точности IEEE 754: binary64 [ править ]

Двоичный формат с плавающей запятой двойной точности - это широко используемый формат на ПК из-за его более широкого диапазона по сравнению с плавающей запятой одинарной точности, несмотря на его производительность и стоимость полосы пропускания. Обычно он известен как двойной . Стандарт IEEE 754 определяет двоичный 64 как имеющий:

  • Знаковый бит : 1 бит
  • Экспонента : 11 бит
  • Существенная точность : 53 бита (52 сохранены явно)

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

Поле экспоненты представляет собой 11-битовое целое число без знака от 0 до 2047 в смещенной форме : значение экспоненты 1023 представляет фактический ноль. Показатели варьируются от -1022 до +1023, потому что показатели -1023 (все нули) и +1024 (все единицы) зарезервированы для специальных чисел.

53-битная точность значащей дроби дает точность от 15 до 17 значащих десятичных цифр (2 −53  ≈ 1,11 × 10 −16 ). Если десятичная строка с не более чем 15 значащими цифрами преобразована в представление двойной точности IEEE 754, а затем преобразована обратно в десятичную строку с тем же количеством цифр, окончательный результат должен соответствовать исходной строке. Если число двойной точности IEEE 754 преобразовано в десятичную строку, содержащую не менее 17 значащих цифр, а затем преобразовано обратно в представление двойной точности, окончательный результат должен соответствовать исходному числу. [1]

Формат записывается с мантиссой, имеющей неявный целочисленный бит значения 1 (за исключением специальных данных, см. Кодирование экспоненты ниже). С 52 битами значимой дроби (F), присутствующими в формате памяти, общая точность составляет 53 бита (приблизительно 16 десятичных цифр, 53 log 10 (2) ≈ 15,955). Биты расположены следующим образом:

Действительное значение, принятое данной 64-битной системой данных с двойной точностью с заданной смещенной экспонентой и 52-битной дробью, равно

или же

Между 2 52 = 4 503 599 627 370 496 и 2 53 = 9 007 199 254 740 992 представимые числа - это в точности целые числа. Для следующего диапазона, от 2 53 до 2 54 , все умножается на 2, поэтому представляемые числа - четные и т. Д. И наоборот, для предыдущего диапазона от 2 51 до 2 52 интервал равен 0,5 и т. Д.

Интервал как доля чисел в диапазоне от 2 n до 2 n +1 равен 2 n -52 . Таким образом, максимальная относительная ошибка округления при округлении числа до ближайшего представимого ( машинный эпсилон ) составляет 2 −53 .

11-битная ширина экспоненты позволяет представлять числа от 10 -308 до 10 308 с точностью до 15-17 десятичных знаков. За счет снижения точности субнормальное представление допускает даже меньшие значения примерно до 5 × 10 -324 .

Экспонентное кодирование [ править ]

Двоичная экспонента с плавающей запятой двойной точности кодируется с использованием двоичного представления смещения с нулевым смещением 1023; также известный как смещение экспоненты в стандарте IEEE 754. Примеры таких представлений:

Показатели и имеют особое значение:000167ff16

  • 000000000002= используется для представления нулей со знаком (если F = 0) и субнормальных чисел (если F ≠ 0); и00016
  • 111111111112= используется для представления ∞ (если F = 0) и NaN (если F ≠ 0),7ff16

где F - дробная часть мантиссы . Все битовые комбинации являются допустимой кодировкой.

За исключением вышеуказанных исключений, все число двойной точности описывается следующим образом:

В случае субнормальных чисел ( e = 0) число двойной точности описывается следующим образом:

Порядок байтов [ править ]

Хотя сегодня повсеместно распространенные процессоры x86 используют хранилище с прямым порядком байтов для всех типов данных (целые числа, числа с плавающей запятой), существует ряд аппаратных архитектур, в которых числа с плавающей запятой представлены в форме с прямым порядком байтов, а целые числа представлены с малым порядком байтов. Порядок байтов. [2] Существуют процессоры ARM , которые имеют представление с плавающей запятой наполовину с прямым порядком байтов, наполовину с прямым порядком байтов с плавающей запятой для чисел с двойной точностью: оба 32-битных слова хранятся в обратном порядке байтов, как целочисленные регистры, но в первую очередь наиболее значимый. Поскольку существовало много форматов с плавающей запятой без " сетевого " стандартного представления для них, XDRстандарт использует IEEE 754 с прямым порядком байтов в качестве своего представления. Поэтому может показаться странным, что широко распространенный стандарт с плавающей запятой IEEE 754 не определяет порядок байтов. [3] Теоретически это означает, что даже стандартные данные с плавающей запятой IEEE, записанные на одной машине, могут быть нечитаемы на другой. Однако на современных стандартных компьютерах (т. Е. Реализующих IEEE 754) на практике можно с уверенностью предположить, что порядок байтов для чисел с плавающей запятой такой же, как и для целых, что делает преобразование простым независимо от типа данных. ( Другое дело - небольшие встроенные системы, использующие специальные форматы с плавающей запятой.)

Примеры двойной точности [ править ]

Кодировки qNaN и sNaN не полностью определены в IEEE 754 и зависят от процессора. Большинство процессоров, таких как семейство x86 и процессоры семейства ARM , используют самый старший бит значимого поля для обозначения тихого NaN; это то, что рекомендуется IEEE 754. Процессоры PA-RISC используют этот бит для указания NaN сигнализации.

По умолчанию, 1 / 3 раундов вниз, а не вверх , как с одинарной точностью , из - за нечетного числа битов мантиссы.

Подробнее:

Учитывая шестнадцатеричное представление 3FD5 5555 5555 5555 16 , Знак = 0 Показатель степени = 3FD 16 = 1021 Показатель смещения = 1023 (постоянное значение; см. Выше) Fraction = 5 5555 5555 5555 16 Value = 2 (Exponent - Exponent Bias) × 1.Fraction - Обратите внимание, что дробь не должна быть здесь преобразована в десятичную. = 2 −2 × (15 5555 5555 5555 16 × 2 −52 ) = 2 −54 × 15 5555 5555 5555 16 = 0,333333333333333314829616256247390992939472198486328125 ≈ 1/3

Скорость выполнения с арифметикой двойной точности [ править ]

Использование переменных с плавающей запятой двойной точности и математических функций (например, sin, cos, atan2, log, exp и sqrt) медленнее, чем работа с их аналогами с одинарной точностью. Одна из областей вычислений, где это является особой проблемой, - параллельный код, работающий на графических процессорах. Например, при использовании NVIDIA «s CUDA платформы, расчетов с двойной точностью дублем, в зависимости от аппаратного обеспечения, приблизительно от 2 до 32 раз , как долго , чтобы завершить по сравнению с теми , осуществляется с помощью одинарной точности . [4]

Ограничения точности для целочисленных значений [ править ]

  • Целые числа от −2 53 до 2 53 (от −9007199254740992 до 9007199254740992) могут быть точно представлены
  • Целые числа от 2 53 до 2 54 = 18014398509481984 округлить до кратного 2 (четное число).
  • Целые числа от 2 54 до 2 55 = 36028797018963968 округляются до кратного 4

Реализации [ править ]

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

C и C ++ [ править ]

C и C ++ предлагают широкий спектр арифметических типов . Стандарты не требуют двойной точности (за исключением необязательного приложения F документа C99 , охватывающего арифметику IEEE 754), но в большинстве систем doubleтип соответствует двойной точности. Однако на 32-разрядной платформе x86 с расширенной точностью по умолчанию некоторые компиляторы могут не соответствовать стандарту C или арифметика может страдать от двойного округления . [5]

Фортран [ править ]

Fortran предоставляет несколько целочисленных и вещественных типов, а 64-битный тип real64, доступный через внутренний модуль Fortran iso_fortran_env, соответствует двойной точности.

Common Lisp [ править ]

Common Lisp предоставляет типы SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT и LONG-FLOAT. Большинство реализаций предоставляют SINGLE-FLOATs и DOUBLE-FLOATs с соответствующими синонимами для других типов. Common Lisp предоставляет исключения для перехвата недополнения и переполнения с плавающей запятой, а также неточное исключение с плавающей запятой согласно IEEE 754. В стандарте ANSI не описаны бесконечности и NaN, однако некоторые реализации предоставляют их как расширения.

Java [ править ]

В Java до версии 1.2 каждая реализация должна была соответствовать IEEE 754. Версия 1.2 позволила реализациям повысить точность промежуточных вычислений для таких платформ, как x87 . Таким образом, был введен модификатор strictfp для обеспечения строгих вычислений IEEE 754.

JavaScript [ править ]

Как указано в стандарте ECMAScript , вся арифметика в JavaScript должна выполняться с использованием арифметики с плавающей запятой двойной точности. [6]

См. Также [ править ]

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

Примечания и ссылки [ править ]

  1. Уильям Кахан (1 октября 1997 г.). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . Архивировано 8 февраля 2012 года (PDF) из оригинала.
  2. ^ Савард, Джон JG (2018) [2005], «Форматы с плавающей запятой» , quadibloc , заархивировано из оригинала 03.07.2018 , получено 16.07.2018
  3. ^ "pack - преобразовать список в двоичное представление" .
  4. ^ «Новый Titan V от Nvidia выталкивает 110 терафлопс с одного чипа» . Оборудование Тома . 2017-12-08 . Проверено 5 ноября 2018 .
  5. ^ «Ошибка 323 - оптимизированный код дает странные результаты с плавающей запятой» . gcc.gnu.org . Архивировано 30 апреля 2018 года . Проверено 30 апреля 2018 года .
  6. ^ ECMA-262 Спецификация языка ECMAScript (PDF) (5-е изд.). Ecma International. п. 29, §8.5 Тип числа . Архивировано (PDF) из оригинала 13 марта 2012 года.