Открыть сервис

Плавающая запятая

Плавающая запятая (также плавающая точка, англ. floating point) — это форма представления вещественных чисел в цифровых вычислительных устройствах, при которой число хранится в виде мантиссы и порядка (экспоненты) в некоторой системе счисления. В отличие от формата с фиксированной запятой, где положение запятой (разделителя целой и дробной части) строго фиксировано, плавающая запятая позволяет динамически смещать запятую, что обеспечивает широкий диапазон представимых значений при относительно постоянной относительной точности. Данный формат является основным для научных, инженерных и графических вычислений, а также для работы с числами, выходящими за пределы целочисленных типов.

История

Ранние механические и электромеханические системы

Идея представления чисел с плавающей запятой впервые была реализована в механических вычислителях. В 1930-х годах немецкий инженер Конрад Цузе в своем компьютере Z1 (1936—1938) использовал двоичное представление чисел с плавающей запятой. Машина оперировала 64-битными числами, где 1 бит отводился под знак, 15 бит — под порядок и 48 бит — под мантиссу. Однако из-за ненадёжности механических элементов Z1 не получил практического распространения.

Электронные компьютеры

В 1940-х годах, с появлением электронных ламп, плавающая запятая стала применяться в первых универсальных компьютерах. Например, в машине ENIAC (1946) числа обрабатывались в десятичной системе с фиксированной запятой, но уже в 1949 году компьютер IBM 704 поддерживал аппаратное умножение и деление чисел с плавающей запятой. В СССР в 1950-х годах была разработана серия машин «Урал» (например, «Урал-1»), где использовалась плавающая запятая с основанием 2.

Стандартизация

До конца 1970-х годов каждый производитель компьютеров использовал собственные форматы плавающей запятой, что приводило к несовместимости данных и программ. В 1985 году Институт инженеров по электротехнике и электронике (IEEE) принял стандарт IEEE 754, который унифицировал представление чисел с плавающей запятой, арифметические операции и обработку исключительных ситуаций. Этот стандарт лёг в основу большинства современных процессоров (x86, ARM, RISC-V) и языков программирования.

Основные понятия и структура

Представление числа

Число с плавающей запятой в системе с основанием \( b \) (обычно 2, реже 10 или 16) представляется в виде:

\[ x = \pm m \times b^{e} \]

где:

  • \( m \) — мантисса (дробная часть, нормализованная так, что \( 1 \leq m < b \) для двоичной системы);
  • \( e \) — порядок (экспонента), целое число со знаком;
  • \( b \) — основание системы счисления (для двоичного формата — 2).

В памяти компьютера число хранится в виде последовательности битов, разделённых на три поля:

  1. Знак (1 бит): 0 — положительное число, 1 — отрицательное.
  2. Порядок (экспонента): несколько битов, хранящих смещённое значение порядка (для представления отрицательных экспонент без знака).
  3. Мантисса (дробная часть): остальные биты, хранящие нормализованную дробную часть.

Нормализация

Для повышения точности числа нормализуются: старшая цифра мантиссы (в двоичной системе — 1) не хранится явно, а подразумевается (так называемый «скрытый бит»). Например, число 1,101 × 2³ хранится как мантисса «101» (без единицы) и порядок 3.

Стандартные форматы IEEE 754

Стандарт IEEE 754 определяет несколько основных форматов:

ФорматРазмер (бит)Биты порядкаБиты мантиссыДиапазон (приблизительно)Точность (десятичных цифр)
Полуточный (binary16)16510±6,1×10⁻⁵ … ±6,5×10⁴≈ 3,3
Одинарный (binary32)32823±1,2×10⁻³⁸ … ±3,4×10³⁸≈ 7,2
Двойной (binary64)641152±2,2×10⁻³⁰⁸ … ±1,8×10³⁰⁸≈ 15,9
Четверной (binary128)12815112±3,4×10⁻⁴⁹³² … ±1,2×10⁴⁹³²≈ 34,0

Наиболее распространены одинарный (float) и двойной (double) форматы.

Специальные значения

Стандарт IEEE 754 предусматривает несколько специальных кодовых комбинаций:

  • Ноль: представлен нулевой мантиссой и нулевым порядком (знак может быть +0 или −0).
  • Бесконечность: мантисса равна нулю, порядок — максимальное значение (например, 255 для binary32). Используется для обозначения переполнения.
  • NaN (Not a Number): мантисса ненулевая, порядок — максимальное значение. Возникает при недопустимых операциях (например, 0/0, sqrt(−1)).

Арифметические операции

Сложение и вычитание

Алгоритм сложения чисел с плавающей запятой включает следующие шаги:

  1. Выравнивание порядков: меньшее число денормализуется (мантисса сдвигается вправо) до совпадения порядков.
  2. Сложение или вычитание мантисс.
  3. Нормализация результата: если мантисса выходит за диапазон [1, 2), производится сдвиг и коррекция порядка.
  4. Округление до доступного количества битов мантиссы.

Умножение и деление

  • Умножение: мантиссы перемножаются, порядки складываются. Затем производится нормализация и округление.
  • Деление: мантисса делимого делится на мантиссу делителя, порядки вычитаются. Результат нормализуется.

Ошибки округления

Из-за конечного размера мантиссы большинство вещественных чисел не могут быть представлены точно. При выполнении арифметических операций возникают ошибки округления, которые могут накапливаться. Например, число 0,1 в двоичной системе является бесконечной периодической дробью и не может быть представлено точно ни в одном из стандартных форматов.

Применение

Научные и инженерные расчёты

Плавающая запятая используется в моделировании физических процессов, обработке сигналов, компьютерном зрении, машинном обучении и других областях, где требуется работа с числами в широком диапазоне (от 10⁻³⁰⁸ до 10³⁰⁸ для double).

Графика и игры

В компьютерной графике (OpenGL, DirectX, Vulkan) для представления координат, цветов, освещения и трансформаций применяются форматы с плавающей запятой (чаще всего binary32). Современные видеокарты имеют специализированные блоки для быстрых операций с плавающей запятой.

Финансовые вычисления

В финансовой сфере плавающая запятая используется реже из-за проблем с точностью округления. Для денежных расчётов предпочтительны форматы с фиксированной запятой или десятичная арифметика (например, IEEE 754-2008 decimal64).

Критика и ограничения

Неточность представления

Как уже отмечалось, многие десятичные дроби (0,1, 0,2) не могут быть точно представлены в двоичной системе. Это приводит к ошибкам, которые могут быть критичными в некоторых приложениях (например, в системах управления или финансовых расчётах).

Неравномерность точности

Относительная точность чисел с плавающей запятой постоянна (≈ 7 десятичных цифр для float), но абсолютная точность уменьшается для больших чисел. Например, число 1 000 000 000 (1e9) и 1 000 000 001 (1e9+1) в формате float могут быть неразличимы, так как шаг между представимыми числами в этом диапазоне превышает 1.

Производительность

Хотя современные процессоры имеют аппаратную поддержку плавающей запятой, операции с ней могут быть медленнее целочисленных, особенно на встраиваемых системах без FPU (Floating Point Unit). В таких случаях приходится эмулировать плавающую запятую программно, что значительно снижает скорость.

Интересные факты

  • В 1994 году в процессорах Intel Pentium была обнаружена ошибка в блоке деления с плавающей запятой (так называемый «Pentium FDIV bug»), которая приводила к неточным результатам при делении некоторых чисел. Ошибка обошлась Intel в 475 миллионов долларов на замену процессоров.
  • Существует стандарт IEEE 754-2008, который добавил форматы с основанием 10 (decimal32, decimal64, decimal128) для точных финансовых расчётов.
  • В некоторых языках программирования (например, JavaScript) все числа представлены в формате double (64-бит), что может приводить к неожиданным результатам при работе с целыми числами, превышающими 2⁵³.

Источники

  • IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019).
  • Goldberg, D. (1991). «What Every Computer Scientist Should Know About Floating-Point Arithmetic». ACM Computing Surveys.
  • Knuth, D. E. (1997). «The Art of Computer Programming, Volume 2: Seminumerical Algorithms» (3rd ed.).
  • Intel Corporation. «Intel 64 and IA-32 Architectures Software Developer’s Manual».
  • ГОСТ Р 51904-2002 (IEEE 754-2008). «Арифметика с плавающей точкой для микропроцессорных систем».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →