Плавающая запятая
Плавающая запятая (также плавающая точка, англ. 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 бит): 0 — положительное число, 1 — отрицательное.
- Порядок (экспонента): несколько битов, хранящих смещённое значение порядка (для представления отрицательных экспонент без знака).
- Мантисса (дробная часть): остальные биты, хранящие нормализованную дробную часть.
Нормализация
Для повышения точности числа нормализуются: старшая цифра мантиссы (в двоичной системе — 1) не хранится явно, а подразумевается (так называемый «скрытый бит»). Например, число 1,101 × 2³ хранится как мантисса «101» (без единицы) и порядок 3.
Стандартные форматы IEEE 754
Стандарт IEEE 754 определяет несколько основных форматов:
| Формат | Размер (бит) | Биты порядка | Биты мантиссы | Диапазон (приблизительно) | Точность (десятичных цифр) |
|---|---|---|---|---|---|
| Полуточный (binary16) | 16 | 5 | 10 | ±6,1×10⁻⁵ … ±6,5×10⁴ | ≈ 3,3 |
| Одинарный (binary32) | 32 | 8 | 23 | ±1,2×10⁻³⁸ … ±3,4×10³⁸ | ≈ 7,2 |
| Двойной (binary64) | 64 | 11 | 52 | ±2,2×10⁻³⁰⁸ … ±1,8×10³⁰⁸ | ≈ 15,9 |
| Четверной (binary128) | 128 | 15 | 112 | ±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), производится сдвиг и коррекция порядка.
- Округление до доступного количества битов мантиссы.
Умножение и деление
- Умножение: мантиссы перемножаются, порядки складываются. Затем производится нормализация и округление.
- Деление: мантисса делимого делится на мантиссу делителя, порядки вычитаются. Результат нормализуется.
Ошибки округления
Из-за конечного размера мантиссы большинство вещественных чисел не могут быть представлены точно. При выполнении арифметических операций возникают ошибки округления, которые могут накапливаться. Например, число 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 →