stringtranslate.com

Формат двойной точности с плавающей запятой

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

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

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

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

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

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

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

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

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

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

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

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

Порядок байтов

Хотя многие процессоры используют хранилище с прямым порядком байтов для всех типов данных (целые, с плавающей запятой), существует ряд аппаратных архитектур, в которых числа с плавающей запятой представлены в форме с прямым порядком байтов, а целые числа представляются в форме с прямым порядком байтов. [2] Существуют процессоры ARM , которые имеют представление чисел с плавающей запятой со смешанным порядком байтов для чисел двойной точности: каждое из двух 32-битных слов сохраняется с прямым порядком байтов, но самое старшее слово сохраняется первым. VAX с плавающей запятой хранит 16-битные слова с прямым порядком байтов в порядке с прямым порядком байтов. Поскольку существовало множество форматов с плавающей запятой, для которых не было представления в стандарте сети, стандарт 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 (постоянное значение; см. выше) Дробь = 5 5555 5555 5555 16 Значение = 2 (Экспонента – Смещение экспоненты) × 1. Дробь. Обратите внимание, что здесь дробь не следует преобразовывать в десятичную. = 2 −2 × (15 5555 5555 5555 16 × 2 −52 ) = 2 −54 × 15 5555 5555 5555 16 = 0,333333333333333314829616256247390992939472198486328125 ≈ 1/3

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

Использование переменных с плавающей запятой двойной точности обычно медленнее, чем работа с их аналогами одинарной точности. Одной из областей вычислений, где это является особой проблемой, является параллельный код, выполняемый на графических процессорах. Например, при использовании платформы NVIDIA CUDA вычисления с двойной точностью могут занять, в зависимости от оборудования, от 2 до 32 раз больше времени по сравнению с вычислениями с одинарной точностью . [4]

Кроме того, многие математические функции (например, sin, cos, atan2, log, exp и sqrt) требуют большего количества вычислений для получения точных результатов двойной точности и поэтому работают медленнее.

Ограничения точности целочисленных значений

Реализации

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

С и С++

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

Фортран

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

Общий Лисп

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

Джава

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

JavaScript

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

JSON

Формат кодирования данных JSON поддерживает числовые значения, а грамматика, которой должны соответствовать числовые выражения, не имеет ограничений на точность или диапазон закодированных таким образом чисел. Однако в RFC 8259 сообщается, что, поскольку числа двоичного формата IEEE 754 широко распространены, хорошая совместимость может быть достигнута за счет реализации обработки JSON, если они не ожидают большей точности или диапазона, чем предлагает двоичный64. [8]

Смотрите также

Примечания и ссылки

  1. ^ Уильям Кахан (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . Архивировано (PDF) из оригинала 8 февраля 2012 года.
  2. ^ Савард, Джон Дж.Г. (2018) [2005], «Форматы с плавающей запятой», четырехъядерный блок , заархивировано из оригинала 03 июля 2018 г. , получено 16 июля 2018 г.
  3. ^ «упаковать – преобразовать список в двоичное представление» .
  4. ^ «Новый Titan V от Nvidia обеспечивает производительность одного чипа 110 терафлопс» . Аппаратное обеспечение Тома . 08.12.2017 . Проверено 5 ноября 2018 г.
  5. ^ «Ошибка 323 – оптимизированный код дает странные результаты с плавающей запятой» . gcc.gnu.org . Архивировано из оригинала 30 апреля 2018 года . Проверено 30 апреля 2018 г.
  6. ^ Дарси, Джозеф Д. «JEP 306: Восстановление всегда строгой семантики с плавающей запятой» . Проверено 12 сентября 2021 г.
  7. ^ ECMA-262 Спецификация языка ECMAScript (PDF) (5-е изд.). Экма Интернешнл. п. 29, §8.5 Тип номера . Архивировано (PDF) из оригинала 13 марта 2012 г.
  8. ^ «Формат обмена данными нотации объектов JavaScript (JSON)» . Рабочая группа по интернет-инжинирингу. Декабрь 2017 года . Проверено 1 февраля 2022 г.