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

Формат с плавающей запятой двойной точности (иногда называемый 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-FLOAT и DOUBLE-FLOAT с соответствующими синонимами для других типов. 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 года.