
- •Международный стандарт представления чисел с плавающей точкой в эвм
- •Введение
- •Числа с плавающей точкой
- •Машинный эпсилон
- •Точность представления
- •Показатель степени
- •Операции и округление
- •Специальные значения
- •Бесконечность
- •Ноль со знаком
- •Ненормализованные числа
- •7.5. Числа с плавающей точкой (вещественные)
- •7.6. Диапазон представления вещественных чисел
Бесконечность
Бесконечность
существует для решения таких ситуаций,
как переполнение и деление на ноль. При
переполнении можно было бы возвращать
максимально представимое число с
плавающей точкой. Однако такое решение
не всегда оправдано. Гораздо выгоднее
знать, что произошло переполнение, и
принять надлежащие меры, получив в
качестве результата
.
Существует положительная и отрицательные
бесконечности. При получении
существует
способ определить по какой причине
произошла ошибка — из-за переполнения
или из-за деления на ноль. Эта информация
доступна в флагах состояния.
Арифметика
с использованием
интуитивна
ясна: при делении конечной величины на
результат
будет нулём; при сложении или вычитании
из конечной величины
результат
будет
или
соответственно.
Приведём небольшой пример бесконечной арифметики.
Допустим, мы работаем с функцией
Данная
запись функции не очень хороша. При
в
знаменателе будет вызвано переполнение
и результатом будет 0. Это некорректно,
так как возвращаемым результатом должна
быть величина порядка
.
Перепишем формулу в другом виде.
Эта
формула не будет так скоро вызывать
переполнения. В нуле она также будет
принимать корректное значение, так как
округлится
нулём.
Этот
пример показывает основное достоинство
использования бесконечной арифметики:
использование
часто
позволяет обойти проверки многочисленных
крайних случаев.
Ноль со знаком
Ноль
соответствует нулевой мантиссе и
показателю степени
.
В зависимости от значения знакового
бита может быть
и
.
Обоснуем ввод этих специальных значений.
Для
начала сделаем интересное замечание:
в стандарте IEEE определено, что
.
Это сделано для того, чтобы при условных
операторах вида
не
возникало неопределённости. Но это не
означает, что стандарт не различает
двух этих значений. При умножении чисел
на нули со знаками или при делении нулей
со знаками на числа знаки определяются
в соответствие с обычной знаковой
арифметикой. Например,
и
.
Предположим,
что у нуля не было бы знака. Тогда при
возникла
бы неопределённость с вычислением
значения выражения
.
Неопределённость заключается в том,
что и
и
принимали
бы значение 0. В тоже время
принимало
бы логически верное значение
.
Другими словами,
.
Учитывая существование бесконечностей со знаками единственно верным решением рассматриваемой проблемы является ввод нулей со знаками.
Приведём ещё один пример.
Рассмотрим
функцию
.
Предположим, что
—
очень маленькое отрицательное число.
Если бы оно округлялось нулём, то
результатом бы была
,
что, конечно, неправильно. В стандарте
IEEE не возникает такой проблемы. В этом
случае
округляется
и
возвращается значение NaN.
Ненормализованные числа
Последним специальным значением стандарта IEEE являются ненормализованные числа.
Рассмотрим
пример. Пусть
,
и
.
Числа
и
—
числа с плавающей точкой, отличающиеся
от минимально представимого числа
больше чем в 10 раз. У этих чисел есть
интересная особенность : их разность
равна нулю, хотя они не равны друг другу.
Это происходит потому, что
округляется
нулём. Нам бы хотелось, чтобы привычное
нам тождество
выполнялось всегда. Без выполнения этого тождества достаточно сложно писать программы, оперирующие с дробными числами. Пришлось бы в код программы включать множество проверок и условных операторов.
Ввод ненормализованных чисел решает эту проблему.
Суть
состоит в том, что при показателе степени
равном
мантисса
не должна быть нормализованной. Таким
образом при
,
и
уже
не минимально представимое число.
также
является корректным числом с плавающей
точкой.
Доступ к формату в различных компиляторах
Visual Studio C++ (2003, 2005)
В папке include установочной директории VC существует стандартный хидер "float.h", в котором описаны основные параметры форматов float, double и long double. Также существует хидер "limits.h", в котором описан ряд функций по работе со специальными значениями.
Borland C compiler (3.1)
В той же папке include находится хидер "float.h"
GCC compiler (3.4)
В папке установки (usr/lib/gcc/...) есть всё таже папка include с хидерами. В ней есть файл "float.h".
Список литературы
-
David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, Vol. 23, No. 1 (March 1991), pages 5--48.