Число с плавающей запятой (или число с плавающей точкой) — экспоненциальная форма представления вещественных (действительных) чисел, в которой число хранится в виде мантиссы и порядка (показателя степени). При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Используемое наиболее часто представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.
«Плавающая запятая» и «плавающая точка»
Так как в некоторых, преимущественно англоязычных и англофицированных странах при записи чисел целая часть отделяется от дробной точкой, то в терминологии этих стран фигурирует название «плавающая точка» (). Так как в России целая часть числа от дробной традиционно отделяется запятой, то для обозначения того же понятия исторически используется термин «плавающая запятая», однако в настоящее время в русскоязычной литературе и технической документации можно встретить оба варианта.
Происхождение названия Название «плавающая запятая» происходит от того, что запятая в позиционном представлении числа (десятичная запятая, или, для компьютеров, двоичная запятая) может быть помещена где угодно относительно цифр в строке. Это положение указывается отдельно во внутреннем представлении. Такое представление может рассматриваться как компьютерная реализация экспоненциальной записи чисел.
Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с фиксированной запятой (и целыми числами) состоит в том, что можно использовать существенно больший диапазон значений при неизменной относительной точности. Например, в форме с фиксированной запятой число, занимающее в целой части и после запятой, может быть представлено в виде . В свою очередь, в формате с плавающей запятой в тех же можно записать числа ; ; ; и так далее, но для этого необходимо иметь дополнительное двухразрядное поле для записи показателей степени основания10 от0 до 16, при этом общее число разрядов составит 8+2=10.
Скорость выполнения компьютером операций с числами, представленными в форме с плавающей запятой, измеряется во FLOPS (от — «[количество] операций с плавающей запятой в секунду») и является одной из основных единиц измерения быстродействия вычислительных систем.
Структура числа Число с плавающей запятой состоит из следующих частей: знак мантиссы (указывает на отрицательность или положительность числа), мантисса (выражает значение числа без учёта порядка), знак порядка, порядок (выражает степень основания числа, на которое умножается мантисса).
и формы Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале , то есть .
Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, можно записать как , , , , и так далее), поэтому распространена (особенно в информатике) также другая форма записи — нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (исключительно), то есть (аналогично, мантисса двоичного числа принимает значения от 1 до 2). В такой форме любое число (кроме ) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа0.
Старший разряд (целая часть числа) мантиссы двоичного числа (кроме0) в нормализованном виде равен1 (так называемая ), поэтому при записи мантиссы числа в ЭВМ старший разряд можно не записывать, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем2 (в троичной, четверичной и др.), этого свойства нет.
Способы записи При ограниченных возможностях оформления (например, отображение числа на семисегментном индикаторе), а также при необходимости обеспечить быстрый и удобный ввод чисел, вместо записи вида ( — мантисса; — основание, чаще всего10; — экспонента), записывают лишь мантиссу и показатель степени, разделяя их буквой«E» (от ). Основание при этом неявно полагают равным10. Например, число в этом случае записывается как 1.528535047E-25.
Краткий обзор Существует несколько способов того, как строки из цифр могут представлять числа:
Наиболее распространённый путь представления значения числа из строки с цифрами — в виде целого числа — запятая (radix point) по умолчанию находится в конце строки. В общем математическом представлении строка из цифр может быть сколь угодно длинной, а положение запятой обозначается путём явной записи символа запятой (или точки) в нужном месте. В системах с представлением чисел в формате с фиксированной запятой существует определённое условие относительно положения запятой. Например, в строке из 8 цифр условие может предписывать положение запятой в середине записи (между 4-й и 5-й цифрой). Таким образом, строка «00012345» обозначает число 1,2345 (нули слева всегда можно отбросить). В экспоненциальной записи используют стандартный (нормализованный) вид представления чисел. Число считается записанным в стандартном (нормализованном) виде, если оно записано в виде , где , называемое мантиссой, такое, что , — целое, называется показатель степени и — целое, основание системы счисления (на письме это обычно 10). То есть в мантиссе запятая помещается сразу после первой значащей (не равной нулю) цифры, считая слева направо, а дальнейшая запись даёт информацию о действительном значении числа. Например, период обращения (на орбите) спутника Юпитера Ио, который равен , в стандартном виде можно записать как . Побочным эффектом ограничения на значения мантиссы является то, что в такой записи невозможно изобразить число0. Запись в форме с плавающей запятой похожа на запись чисел в стандартном виде, но мантисса и экспонента записываются раздельно. Мантисса записывается в нормализованном формате — с фиксированной запятой, подразумеваемой после первой значащей цифры. Возвращаясь к примеру с Ио, запись в форме с плавающей запятой будет иметь мантиссу 1,528535047 и показатель 5. Это означает, что имеется в виду число в 105 раз больше числа 1,528535047, то есть для получения подразумеваемого числа запятая сдвигается на 5 разрядов вправо. Однако, запись в форме с плавающей запятой используется в основном в электронном представлении чисел, при котором используется основание системы счисления 2, а не 10. Кроме того, в двоичной записи мантисса обычно денормализована, то есть запятая подразумевается до первой цифры, а не после, и целой части вообще не имеется в виду — так появляется возможность и значение 0 сохранить естественным образом. Таким образом, десятичная 9 в двоичном представлении с плавающей запятой будет записана как мантисса +1001000…0 и показатель +0…0100. Отсюда, например, беды с двоичным представлением чисел типа одной десятой (0,1), для которой двоичное представление мантиссы оказывается периодической двоичной дробью — по аналогии с 1/3, которую нельзя конечным количеством цифр записать в десятичной системе счисления.
Запись числа в форме с плавающей запятой позволяет производить вычисления над широким диапазоном величин, сочетая фиксированное количество разрядов и точность. Например, в десятичной системе представления чисел с плавающей запятой (3 разряда) операцию умножения, которую мы бы записали как 0,12 × 0,12 = 0,0144 в нормальной форме представляется в виде (1,20) × (1,20) = (1,44). В формате с фиксированной запятой мы бы получили вынужденное округление 0,120 × 0,120 = 0,014. Мы потеряли крайний правый разряд числа, так как данный формат не позволяет запятой «плавать» по записи числа.
Диапазон чисел, представимых в формате с плавающей запятой Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от 4,94 до 1,79 (от 2−52 × 2−1022 до ~1 × 21024). (или от 3,7 до 9,99). В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы. В специализированных устройствах (например, GPU) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти, выделенный под мантиссу и показатель, задаётся программно и ограничивается лишь объёмом доступной памяти ЭВМ (см. Арифметика произвольной точности).
{| class="standard" !Точность || Одинарная || Двойная || Расширенная |- ! Размер (байты) | 4 || 8 || 10 |- ! Число десятичных знаков | ~7.2 || ~15.9 || ~19.2 |- ! Наименьшее значение (>0), denorm | 1,4 || 4,9 || 3,7 |- ! Наименьшее значение (>0), normal | 1,2 || 2,3 || 1 |- ! Наибольшее значение | 3,4×10+38 || 1,7×10+308 || 9,9×10+1091 |- ! Поля | S-E-F || S-E-F || S-E-I-F |- ! Размеры полей | 1-8-23 || 1-11-52 || 1-15-1-63 |} S — знак, E — показатель степени, I — целая часть, F — дробная часть Так же, как и для целых, знаковый бит — старший.
Машинный эпсилон В отличие от чисел с фиксированной запятой, сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками. Но относительная погрешность записи чисел одинакова и для малых чисел, и для больших. Машинным эпсилоном называется наименьшее положительное число ε такое, что (знаком обозначено машинное сложение). Грубо говоря, числа a и b, соотносящиеся так, что , машина не различает.
Для одинарной точности , то есть приблизительно 7 значащих цифр. Для двойной точности: , 15 значащих цифр.
См. также Вычислительная устойчивость Фиксированная запятая Число половинной точности Число одинарной точности Число двойной точности Число четверной точности Десятичный разделитель
Примечания
Литература
Ссылки Что нужно знать про арифметику с плавающей запятой
* Категория:Типы данных