Международный стандарт представления чисел с плавающей точкой в ЭВМ
Материал из MachineLearning.
Содержание |
Введение
Практически любой язык программирования даёт возможность использовать в вычислениях дробные числа. Когда дело касается программной реализации численных методов или любых других вычислений на ЭВМ, важным вопросом является внутреннее представление чисел, с которым приходится работать программисту. От этого главным образом зависит точность вычислений,а также их скорость.
В этом отчёте будут рассматриваться те аспекты представления чисел в ЭВМ, которые важны пользователям, желающим активно работать с дробными величинами. Вначале будут введены общепринятые понятия для дальнейшего изложения материала. Будет достаточно подробно рассмотрен наиболее часто используемый стандарт IEEE 754. В заключение будут приведены способы доступа к основным параметрам представления дробных чисел в ряде языков программирования (C,C++,Fortran,Pascal).
Числа с плавающей точкой
Числа с плавающей точкой - общепринятая форма представления дробных чисел в ЭВМ. Основными параметрами такой формы представления является основание степени (base) и точность (precision). При этом всегда требуется, чтобы основание степени было целым чётным числом. Если и , то число 0.1 представляется в виде . Однако, очевидно, что при определённых параметрах некоторые числа не удастся представить точно. Например, при и то же самое число 0.1 представляется приблизительно в виде (поскольку в бинарном представлении число 0.1 имеет бесконечный вид).
В общем случае при заданных параметрах запись вида представляет число
При этом называется мантиссой числа и состоит из позиций. В дальнейшем под числом с плавающей точкой мы будем понимать дробные числа точно представимые в смысле данной формы.
Существуют ещё два важных параметра — максимальный и минимальный показатели степени и . Таким образом, при фиксированных параметрах мы можем представить разных чисел с учётом знака.
Здесь возникает проблема - что делать с числами, не представимыми точно. Чаще всего такая ситуация возникает при попытке представить числа, имеющие слишком длинное или вообще бесконечное представление (пример с 0.1). В этом случае нужное нам число лежит где-то между двумя числами с плавающей точкой и будет представляться одним из них. Реже встречается попытка использовать числа, меньшие чем , или большие чем . Подробнее об этих случаях речь пойдёт в разделе "Стандарт IEEE".
Введём ещё одну договорённость. Пока что представление чисел с плавающей точкой неуникально. Например, при и число 0.1 можно представить как и как . Представление числа, в старшей позиции которого стоит цифра, отличная от нуля , мы будем называть нормализованным. Использование нормализованных форм решает проблему неединственности представления чисел с плавающей точкой. (Однако, при такой договорённости возникает интересный вопрос — как представлять 0?)
Машинный эпсилон
Как известно, существует 2 вида погрешностей вычисления — абсолютная и относительная (Ошибки вычислений). Под относительной погреностью понимается отношение
где – значение, полученное при округлении, а - точное значение вычислений.
Представим, что результатом округления действительного числа стало число . Худшему случаю округления соответствует абсолютная погрещность, равная , где . В мантиссе результата округления позиций , в мантиссе абсолютной погрешности позиция.
При попытке написать неравенство для относительной погрешности, соответствующей упомянутой выше абсолютной погрешности, несложно получить, что
- .
Величину принято называть машинным эпсилоном (machine epsilon). Таким образом можно утверждать, что при округлении дробного числа ближайшим к нему числом с плавающей точкой относительная погрешность округления не превосходит машинного эпсилона.
Существует и другое определение. Машинный эпсилон можно определить как минимальное положительное число, которое будучи прибавлено к единице даёт результат отличный от единицы. Читателю предлагается проверить эквивалентность этих определений самостоятельно.
Стандарт IEEE
Существует два разных стандарта IEEE для чисел с плавающей точкой. IEEE 754 - двоичный стандарт и требует, чтобы , а для одинарной точности (single) и для двойной точности (double). Также в стандарте IEEE 754 точно обговорено использование битов при представлении чисел в одинарной и двойной точностях. В стандарте IEEE 854 может принимать значение 10 или 2. Также ничего не говорится о распределении битов между мантиссой и степенью.
Понятие стандарт IEEE используется для обозначения свойств, присущих обоим из перечисленных стандартов.
Основание степени
Выбор в качестве основания степени 10 не требует особых разъяснений. Десятичная система - система, привычная для человека. В случае двоичной системы стоит обсудить некоторые достоинства, присущие ей. Мы договорились использовать нормализованные формы чисел. Если , то в старшей позиции может стоять только 1. Это даёт нам возможность не хранить эту единицу в памяти и тем самым получить дополнительный бит для мантиссы. В этом случае принято говорить, что стандарт использует скрытый бит (hidden bit).
Вернёмся к вопросу о представлении нуля в нормализованной форме. Ноль соответствует нулевой мантиссе и степени . Таким образом ноль представляется в виде .
Точность представления
Стандарт IEEE предлагает 4 разных точности: одинарныя (single), двойная (double), одинарная расширенная (single-extended) и двойная расширенная (double-extended). IEEE 754 жёстко обговривают число бит одинарной и двойной точности. Это означает, что на всех ЭВМ, поддерживающих IEEE 754, количество бит в представлении чисел с одинарной точностью и с двойной точностью фиксированы. Количество бит расширенных точностей жёстко не фиксируется. Расширенные форматы призваны хоть немного увеличить количество бит на мантиссу и на показатель степени. Ниже представлена таблица параметров различных точностей в стандарте IEEE.
Параметры | Формат | |||
Single | Single-extended | Double | Double-extended | |
p | 24 | 32 | 53 | 64 |
+127 | 1023 | +1023 | ||
-126 | -1022 | |||
Показатель степени | 8 бит | бит | 11 бит | 15 бит |
Длинна записи | 32 бит | 43 бит | 64 бит | 79 бит |
Рекомендации программисту
Заключение
Список литературы
- David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, Vol. 23, No. 1 (March 1991), pages 5--48.