Числа с плавающей запятой¶
Числа с плавающей запятой (также числа с плавающей точкой) — это форма представления вещественных чисел в цифровых вычислительных устройствах, при которой число хранится в виде набора отдельных полей, содержащих знак, мантиссу и порядок. Данный способ позволяет работать с числами в широком диапазоне значений — от очень малых (например, \(10^{-38}\)) до очень больших (например, \(10^{38}\)) — с ограниченной, но предсказуемой точностью. Основным стандартом, описывающим представление и арифметику чисел с плавающей запятой, является IEEE 754, принятый в 1985 году и впоследствии многократно уточнявшийся.
¶Принцип представления
Число с плавающей запятой в машинном представлении кодируется тремя компонентами:
- Знак — один бит, определяющий, является ли число положительным или отрицательным.
- Порядок (экспонента) — целое число со знаком, задающее масштаб числа (степень двойки, на которую умножается мантисса).
- Мантисса (значащая часть) — дробная часть числа, нормализованная таким образом, что её целая часть равна единице (в нормализованной форме).
Формула для вычисления значения числа:
\[ \text{Значение} = (-1)^{\text{знак}} \times (1 + \text{мантисса}) \times 2^{\text{порядок} - \text{смещение}} \]
где «смещение» (bias) — константа, равная \(2^{k-1} - 1\) для порядка длиной \(k\) бит. Использование смещения позволяет хранить порядок как беззнаковое целое, что упрощает сравнение чисел.
¶История
Идея представления чисел в виде мантиссы и порядка восходит к работам учёных XVII—XVIII веков, в частности к логарифмическим таблицам Джона Непера. Однако в вычислительной технике этот принцип впервые был реализован в 1940-х годах.
Первым массовым компьютером, аппаратно поддерживавшим операции с плавающей запятой, стал IBM 704 (1954 год). В нём использовался 36-битный формат с 8-битным порядком и 27-битной мантиссой. В 1960-х годах различные производители (IBM, DEC, Honeywell) разрабатывали собственные несовместимые форматы, что затрудняло перенос программного обеспечения.
Ситуация изменилась в 1985 году, когда Институт инженеров электротехники и электроники (IEEE) принял стандарт IEEE 754, унифицировавший представление чисел с плавающей запятой. Стандарт был разработан при активном участии Уильяма Кахана, впоследствии получившего за этот вклад Тьюринговскую премию. В 2008 году вышла вторая редакция стандарта (IEEE 754-2008), а в 2019 году — третья (IEEE 754-2019).
В СССР и России разработка собственных форматов чисел с плавающей запятой велась, например, в рамках создания ЭВМ серии «Эльбрус» (1970–1980-е годы). Однако с распространением IBM-совместимых компьютеров и стандарта IEEE 754 отечественные вычислительные системы перешли на международные форматы.
¶Основные форматы по стандарту IEEE 754
Стандарт IEEE 754 определяет несколько основных форматов, различающихся количеством бит, отводимых под порядок и мантиссу.
¶Двоичные форматы
| Формат | Общее количество бит | Биты порядка | Биты мантиссы | Смещение порядка | Диапазон (приблизительно) | Точность (десятичных цифр) |
|---|---|---|---|---|---|---|
| binary16 (половинный) | 16 | 5 | 10 | 15 | ±6,5×10⁻⁸ … ±6,5×10⁴ | ~3.3 |
| binary32 (одинарный) | 32 | 8 | 23 | 127 | ±1,2×10⁻³⁸ … ±3,4×10³⁸ | ~7.2 |
| binary64 (двойной) | 64 | 11 | 52 | 1023 | ±2,2×10⁻³⁰⁸ … ±1,8×10³⁰⁸ | ~15.9 |
| binary128 (четверной) | 128 | 15 | 112 | 16383 | ±3,4×10⁻⁴⁹³² … ±1,2×10⁴⁹³² | ~34.0 |
Наиболее распространёнными форматами являются binary32 (тип float в языках C, C++, Java, Python) и binary64 (тип double).
¶Десятичные форматы
Стандарт IEEE 754-2008 также ввёл форматы для десятичной арифметики (decimal32, decimal64, decimal128), в которых мантисса и порядок хранятся как десятичные числа. Эти форматы используются в финансовых и бухгалтерских приложениях, где требуется точное представление десятичных дробей (например, 0.10), не достижимое в двоичных форматах.
¶Особенности и специальные значения
Числа с плавающей запятой имеют ряд специальных значений, кодируемых определёнными комбинациями бит порядка и мантиссы:
- Нуль — представлен двумя формами: +0 и −0 (отличаются битом знака). Арифметически они ведут себя одинаково, за исключением некоторых операций (например, деления 1/0 даёт +∞, а 1/−0 даёт −∞).
- Бесконечность — также существует положительная (+∞) и отрицательная (−∞). Возникает при переполнении (результат операции превышает максимально представимое число) или при делении ненулевого числа на нуль.
- NaN (Not a Number) — значение, обозначающее нечисловой результат (например, 0/0, ∞−∞, квадратный корень из отрицательного числа). Различают тихие NaN (quiet NaN, qNaN) — не вызывают исключения при большинстве операций, и сигнальные NaN (signaling NaN, sNaN) — вызывают исключение при использовании.
- Денормализованные числа — числа, у которых порядок равен минимальному значению (все биты порядка равны нулю), а мантисса не имеет неявной единицы. Позволяют представлять числа, меньшие минимального нормализованного (постепенное исчезновение значимости — gradual underflow).
¶Арифметические операции
Стандарт IEEE 754 предписывает точные правила выполнения основных арифметических операций (сложение, вычитание, умножение, деление, квадратный корень) и округления. Округление может производиться одним из пяти режимов:
- К ближайшему (round to nearest, ties to even) — по умолчанию; если дробная часть ровно 0.5, округление производится до чётной цифры.
- К нулю (round toward zero) — отбрасывание дробной части.
- К +∞ (round toward +∞) — округление вверх.
- К −∞ (round toward −∞) — округление вниз.
- К ближайшему, с округлением от нуля (round to nearest, ties away from zero) — добавлен в IEEE 754-2008.
¶Проблемы и ограничения
¶Ошибки округления
Поскольку числа с плавающей запятой представляют лишь конечное подмножество вещественных чисел, большинство вещественных чисел не могут быть представлены точно. Это приводит к ошибкам округления, которые могут накапливаться при последовательных вычислениях. Классический пример — вычисление \(0.1 + 0.2\) в двоичном формате binary32 даёт результат \(0.30000001192092896\), а не \(0.3\).
¶Потеря значимости
При вычитании двух близких по величине чисел может произойти катастрофическая потеря значимости (catastrophic cancellation), когда все или большинство значащих цифр результата оказываются нулями.
¶Сравнение на равенство
Из-за ошибок округления сравнение чисел с плавающей запятой на точное равенство (например, if (x == 0.1)) часто даёт неожиданные результаты. Рекомендуется сравнивать с некоторым допуском (эпсилоном).
¶Применение
Числа с плавающей запятой используются повсеместно во всех областях, где требуется работа с вещественными числами:
- Научные и инженерные расчёты — моделирование физических процессов, обработка сигналов, компьютерное зрение.
- Компьютерная графика — представление координат, цветов, освещения, трансформаций.
- Финансовые вычисления — хотя для точных денежных расчётов чаще применяются десятичные форматы или целочисленная арифметика (в копейках/центах).
- Искусственный интеллект — обучение нейронных сетей обычно выполняется в формате binary32 или binary16 (для ускорения на специализированных процессорах).
¶Аппаратная поддержка
Большинство современных процессоров (x86, ARM, RISC-V) имеют встроенные блоки для операций с плавающей запятой (FPU — floating-point unit). В процессорах Intel и AMD FPU реализован начиная с моделей i486 (1989 год) и полностью соответствует стандарту IEEE 754. В графических процессорах (GPU) операции с плавающей запятой являются основой вычислений, и современные GPU могут выполнять триллионы таких операций в секунду.
¶Альтернативы
В некоторых областях используются альтернативные форматы:
- Фиксированная запятая — числа с фиксированным положением десятичной точки; проще в реализации, но имеют меньший диапазон.
- Длинная арифметика (bignum) — представление чисел произвольной точности, используемое в криптографии и символьных вычислениях.
- Posit — альтернативный формат, предложенный Джоном Густафсоном в 2017 году, обещающий большую точность и диапазон при том же количестве бит, но пока не получивший широкого распространения.
¶Источники
- IEEE Standard for Floating-Point Arithmetic. IEEE Std 754-2019 (Revision of IEEE Std 754-2008). — IEEE, 2019.
- Goldberg D. What Every Computer Scientist Should Know About Floating-Point Arithmetic // ACM Computing Surveys. — 1991. — Vol. 23, no. 1. — P. 5–48.
- Кнут Д. Э. Искусство программирования. Том 2. Получисленные алгоритмы. — 3-е изд. — М.: Вильямс, 2007. — Глава 4.
- Overton M. L. Numerical Computing with IEEE Floating Point Arithmetic. — SIAM, 2001.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


