Международный стандарт представления чисел с плавающей точкой в ЭВМ
Материал из 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).
Вернёмся к вопросу о представлении нуля в нормализованной форме.
Ноль соответствует нулевой мантиссе и степени . Таким образом ноль представляется в виде
.
Рекомендации программисту
Заключение
Список литературы
- David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, Vol. 23, No. 1 (March 1991), pages 5--48.