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

Числа с плавающей запятой

Числа с плавающей запятой (также числа с плавающей точкой) — это форма представления вещественных чисел в цифровых вычислительных устройствах, при которой число хранится в виде набора отдельных полей, содержащих знак, мантиссу и порядок. Данный способ позволяет работать с числами в широком диапазоне значений — от очень малых (например, \(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 (половинный)1651015±6,5×10⁻⁸ … ±6,5×10⁴~3.3
binary32 (одинарный)32823127±1,2×10⁻³⁸ … ±3,4×10³⁸~7.2
binary64 (двойной)6411521023±2,2×10⁻³⁰⁸ … ±1,8×10³⁰⁸~15.9
binary128 (четверной)1281511216383±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 →