Формат чисел с плавающей запятой двойной точности (иногда называемый 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.
Двоичные числа с плавающей запятой двойной точности — это широко используемый формат на ПК из-за его более широкого диапазона по сравнению с плавающей запятой одинарной точности, несмотря на его производительность и стоимость полосы пропускания. Он широко известен просто как 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. Примерами таких представлений могут быть:
Экспоненты и имеют особое значение:00016
7ff16
000000000002
= используется для обозначения знакового нуля (если F = 0) и субнормальных чисел (если F ≠ 0); и00016
111111111112
= используется для обозначения ∞ (если F = 0) и NaN (если F ≠ 0),7ff16
где F — дробная часть мантиссы . Все битовые комбинации являются допустимой кодировкой.
За исключением вышеуказанных исключений, все число двойной точности описывается следующим образом:
В случае субнормальных чисел ( e = 0) число двойной точности описывается следующим образом:
Кодировки 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]
Согласно стандарту ECMAScript , вся арифметика в JavaScript должна выполняться с использованием арифметики с плавающей запятой двойной точности. [7]
Формат кодирования данных JSON поддерживает числовые значения, а грамматика, которой должны соответствовать числовые выражения, не имеет ограничений на точность или диапазон закодированных таким образом чисел. Однако в RFC 8259 сообщается, что, поскольку числа двоичного формата IEEE 754 широко распространены, хорошая совместимость может быть достигнута за счет реализации обработки JSON, если они не ожидают большей точности или диапазона, чем предлагает двоичный64. [8]