Число двойной точности

Число́ двойно́й то́чности (Double precision, Double) — компьютерный формат представления числа с плавающей запятой, занимающий в памяти 64 бита, или 8 байт. Как правило, обозначает числа с плавающей запятой стандарта IEEE 754.

Числа с плавающей запятой (двойной/одинарной/четверной точности) поддерживаются сопроцессором (до 80486SX включительно выполнен как отдельный модуль — 0х87/0х287/0х387/0х487, начиная с 80486DX является встроенным в главный процессор. Сопроцессор, хотя он сейчас и является частью главного процессора, принято называть FPU — Floating Point Unit, буквально «модуль плавающей запятой»). В компьютерах, которые имеют 64-разрядные числа с плавающей запятой, большинство чисел хранятся в двойной точности, поскольку использование чисел одинарной точности обеспечивает почти такую же производительность, но все вычисления в FPU осуществляются в 80-битном (расширенном, extended) представлении.

Одним из первых языков программирования, позволявшим использовать числа одинарной и двойной точности с плавающей запятой, был Фортран.

Числа двойной точности с плавающей запятой эквивалентны по точности числу с 15-17 значащими десятичными цифрами (в среднем 16,3) в диапазоне примерно от 10−308 до 10308.

Знак
(11 бит)
Порядок
(52 бита)
Мантисса
63 56 55 48 47 40 39 32 31 24 23 16 15 8 7 0

Окончательное значение числа равняется ±знак · (1+мантисса/ 252) × 2порядок − 1023. Знак 0 соответствует положительным числам, знак 1 отрицательным. Старший бит мантиссы, который всегда равен единице, опускается. Порядок 0 записывается как 1023.

Существуют также денормализованные числа, записываемые порядком 00…00 и имеющие значение ±знак × (0+мантисса/ 252) · 21 − 1023. Денормализованные числа имеют уменьшенное количество значащих цифр мантиссы. Порядок 11…11 предназначен для записи особых чисел: «бесконечности» и «не-числа» — NaN.

Примеры чисел двойной точности

  • 0x 3ff0 0000 0000 0000 = 1
  • 0x 3ff0 0000 0000 0001 ≈ 1,0000000000000002 (наименьшее число, большее 1)
  • 0x 3ff0 0000 0000 0002 ≈ 1,0000000000000004
  • 0x 4000 0000 0000 0000 = 2
  • 0x c000 0000 0000 0000 = −2
  • 0x 0000 0000 0000 0001 = 2-1022-52 ≈ 4,9406564584124654×10−324 (минимальное денормализованное положительное число двойной точности)
  • 0x 000f ffff ffff ffff = 2-1022- 2-1022-52 ≈ 2,2250738585072009×10−308 (максимальное денормализованное положительное число двойной точности)
  • 0x 0010 0000 0000 0000 = 2-1022 ≈ 2,2250738585072014×10−308 (минимальное нормализованное положительное число двойной точности)
  • 0x 7fef ffff ffff ffff = (1 + (1 — 2-52))×21023 ≈ 1,7976931348623157×10308 (максимальное число двойной точности)
  • 0x 0000 0000 0000 0000 = 0
  • 0x 8000 0000 0000 0000 = −0
  • 0x 7ff0 0000 0000 0000 = Infinity
  • 0x fff0 0000 0000 0000 = −Infinity
  • 0x 7fff ffff ffff ffff = NaN
  • 0x 3fd5 5555 5555 5555 ≈ 1/3

Реализации

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

C и C++

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

Фортран

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

Common Lisp

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

Java

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

JavaScript

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

JSON

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

Rust и Zig

В языках Rust и Zig имеется тип данных f64[5][6].

См. также

Примечания

  1. ↑ Bug 323 – optimized code gives strange floating point results. gcc.gnu.org. Дата обращения: 30 апреля 2018. Архивировано 30 апреля 2018 года.
  2. ↑ Darcy, Joseph D. JEP 306: Restore Always-Strict Floating-Point Semantics. Дата обращения: 12 сентября 2021.
  3. ↑ ECMA-262 ECMAScript Language Specification. — 5th. — Ecma International. Архивная копия от 13 марта 2012 на Wayback Machine
  4. ↑ RFC 8259: STD 90: The JavaScript Object Notation (JSON) Data Interchange Format
  5. ↑ Data Types - The Rust Programming Language. doc.rust-lang.org. Дата обращения: 10 августа 2024. Архивировано 10 августа 2024 года.
  6. ↑ Documentation - The Zig Programming Language. ziglang.org. Дата обращения: 10 августа 2024. Архивировано 31 марта 2022 года.

Ссылки