Введение

64-битный формат компьютерных чисел

Формат чисел с плавающей запятой двойной точности (иногда называемый FP64 или float64) — это формат чисел с плавающей запятой, обычно занимающий 64 бита в компьютерной памяти; он представляет широкий динамический диапазон числовых значений, используя плавающую точку. Двойная точность может быть выбрана, когда диапазона или точности одинарной точности недостаточно. В стандарте IEEE 754 2008 64-битный формат с основанием 2 официально называется binary64; в IEEE 754 1985 он назывался double. IEEE 754 определяет дополнительные форматы чисел с плавающей запятой, включая 32-битный формат одинарной точности с основанием 2 и, более недавно, представления с основанием 10 (числа с плавающей запятой в десятичной форме). Одним из первых языков программирования, предоставивших типы данных с плавающей запятой, был Fortran. До широкого распространения IEEE 754 1985 представление и свойства типов данных с плавающей запятой зависели от производителя компьютера и модели, а также от решений, принятых разработчиками языков программирования. Например, тип данных двойной точности в GW BASIC был 64-битным форматом MBF с плавающей запятой.

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

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

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

Целые числа от -253 до 253 (от -9 007 199 254 740 992 до 9 007 199 254 740 992) могут быть представлены точно. Целые числа между 253 и 254 = 18 014 398 509 481 984 округляются до ближайшего четного числа (кратного 2). Целые числа между 254 и 255 = 36 028 797 018 963 968 округляются до ближайшего числа, кратного 4. Целые числа между 2n и 2n+1 округляются до ближайшего числа, кратного 2n−52.

Реализация

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

C и C++

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

Фортран

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

Обычный Lisp

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. Для принудительного использования строгих вычислений IEEE 754 был введен модификатор `strictfp`. Строгая арифметика с плавающей точкой была восстановлена в Java 17.

Язык JavaScript

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

JSON

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