Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Арифметика раздел 5.doc
Скачиваний:
7
Добавлен:
14.08.2019
Размер:
975.36 Кб
Скачать

5.3 Введение в стандарт ieee 754-1985 “Двоичная арифметика с плавающей точкой”

Разнообразие способов представления чисел в форматах с плавающей точкой приводило к тому, что арифметика универсальных ЦВМ разных фирм несколько различалась и результаты выполнения одной и той же программы на языке высокого уровня не совпадали и порой весьма существенно. Конечно, если программа предназначалась для подсчета числа иголок на елках в парке, то такое расхождение в результатах ее работы приемлемо. Однако существуют программы, предназначенные для управления различными процессами, ошибочный результат выполнения которых может приводить к гигантским потерям и более того к аварийным ситуациям, сопряженным с потерей человеческих жизней, например при взрыве атомного реактора вызванного ошибкой в управляющей программе.

Разработку столь ответственных программ выполняют высококвалифицированные специалисты и программисты, сознающие всю полноту возлагаемой на них ответственности и знающие во всех тонкостях особенности арифметики ЦВМ, для которых они предназначены. При программировании учитывают возможность возникновения исключительных ситуаций при любых возможных сочетаниях исходных данных и предусматривают их обработку с целью ликвидации негативных последствий. Выполняется детальное и тщательное тестирование программы. Для этого создаются специализированные тесты, затраты на синтез которых могут превышать затраты на проектирование собственно самой программы. Затраты времени на создание подобных программ и их стоимость могут быть весьма велики.

Теперь представьте, что времена меняются, ЦВМ стареет и возникает потребность в ее замене другой с несколько иной арифметикой. Или необходим перенос программ проявивших себя положительно в ходе многолетней эксплуатации на новый объект управления с ЦВМ другой фирмы. Нет никаких гарантий того, что в новых условиях заимствованное программное обеспечение не допустит ошибки в вычислениях. Единственным выходом из сложившейся ситуации является создание нового программного обеспечения.

Все это послужило причиной тому, что IEEE (Институт инженеров по электротехнике и электронике США) в конце 70-х годов создал комиссию, рассмотревшую множество предложений. Результатом работы комиссии явился стандарт IEEE 754 «Двоичная арифметика с плавающей точкой» [rr] (1985г.), ставший международным. Его основы разработал профессор математики университета Беркли William Kahan.

В последующие годы на базе IEEE 754 – 1985 были разработаны стандарты

  • IEEE 854 – 1987 покрывающий десятичную арифметику также как и двоичную;

  • IEC «Двоичная арифметика с плавающей точкой для микропроцессорных систем» (IEC - International Electrotechnical Commission).

В настоящее время стандарт IEEE 754 – 1985 пересматривается рабочей группой. Смотри в Интернете IEEE 754r.

Стандарт IEEE 754 не обязывает, а рекомендует применение пакета оговоренных в нем форматов, способов кодирования данных, округления результатов и многое другое. Задача выбора формата для конструктора универсальной ЦВМ предельно упростилась, и с этого времени фирмы стали производить универсальные ЦВМ с арифметикой с плавающей точкой удовлетворяющей рекомендациям стандарта. Задача программистов также несколько упростилась, т.к. нет необходимости изучать особенности двоичной арифметики с плавающей точкой разных ЦВМ, достаточно овладеть знанием стандарта. Но нужно помнить, что стандарты консервативны, но не вечны.

Конструкторы специализированных вычислителей сохранили полную свободу выбора способов представления чисел.

Основные форматы. Стандарт IEEE 754 определил два основных формата: с одинарной точностью (32 бита) и с удвоенной точностью (64 бита) рис.5-6. Кроме того, определены вспомогательные расширенные форматы с обычной и с повышенной точностью предназначенные для снижения ошибок округления и использования в промежуточных вычислениях.

Код знака (+) – 0, знака (–) – 1. Коды мантиссы и смещенного порядка двоичные. Основание порядка и мантиссы 2.

При длине поля порядка 8 бит смещение bias=127.

При длине поля порядка 11 бит смещение bias=1023.

Предельные коды в поле порядка, содержащие все нули или все единицы, используют для специальных целей.

Коды от 00…01 до 11…10 включительно кодируют смещенный порядок нормализованного числа.

Так как в соответствии с (5-01) , то минимальные порядки нормализованных чисел

  • в формате с одинарной точностью 1–127= –126;

  • в формате с удвоенной точностью 1–1023= –1022.

Так как и , то максимальные порядки нормализованных чисел

  • в формате с одинарной точностью 254-127= +127;

  • в формате с удвоенной точностью 2046-1023= +1023.

М антиссу представляют как число без знака. Знак относят ко всему числу. Нормализованная мантисса . Старший разряд нормализованной мантиссы во всех форматах IEEE 754 имеет вес 20 и задан по умолчанию равным 1. В разрядной сетке хранится не мантисса, а разряды ее дробной части (fraction), расположенные справа от запятой. Таким образом, значение нормализованной мантиссы содержит 24 или 53 разряда (на один разряд больше, чем разрядность кода дробной части мантиссы в формате).

Максимальное значение мантиссы нормализованной 1,11…1 и почти равно 2. Минимальное значение нормализованной мантиссы 1,00…0 равно 1.

Если мантисса нормализована, то код смещенного порядка не может быть 11…1 или 00…0.

Пример 5-6. Пусть в одинарном формате записан код

1|0000 1111|001 0000 0000 0000 0000 0000

Найдем его значение. Бит знака 1. Следовательно, знак числа (–). Смещенный порядок числа 0000 11112=1510. Из (5-01) следует, что порядок числа . Так как число нормализованное и его старший значащий разряд задан по умолчанию равным 1, то мантисса числа равна

1.001 0000 0000 0000 0000 00002=11/8=1,12510.

Следовательно, число равно (–1,125×2 -112).

Ненормализованная мантисса отличается от нормализованной тем, что неявно заданный разряд целого равен 0, а поле дробной части имеет значение отличное от нуля. При этом код в поле смещенного порядка 00…0 и он соответствует минимальному порядку (–126) или (–1022). Следовательно, минимальный порядок –126 (–1022) представлен двумя кодами в поле смещенного порядка

  • 00…01, если мантисса нормализована;

  • 00…00, если мантисса ненормализованная.

Пример 5-7. Пусть в одинарном формате записан код

1|0000 0000|001 0000 0000 0000 0000 0000

Знак числа (–). Так как смещенный порядок и дробная часть мантиссы не равна нулю, то порядок . Мантисса ненормализованная и равна

0,001 0000 0000 0000 0000 00002=1/8=0,12510.

Следовательно, число равно (–0,125×2 -126).

Код числа равного нулю содержит в полях смещенного порядка и мантиссы 00…0, а в поле знака 0 или 1. Следовательно, число равное нулю может быть представлено в формате как (+0) или как (–0). Этот код можно интерпретировать как 0,02-126 или 0,02-1022 в зависимости от типа формата.

Код в поле смещенного порядка, содержащий 1 во всех битах при нулевой дробной части мантиссы означает, что число равно или в зависимости от содержимого поля знака. Число с этим значением может быть операндом или результатом операции. Бесконечности должны интерпретироваться в единственном смысле, то есть как

< (любое конечное число) <

Пример 5-8. Примеры записи чисел равных нулю и бесконечности в одинарном формате:

+0: 0|0000 0000|000 0000 0000 0000 0000 0000

–0: 1|0000 0000|000 0000 0000 0000 0000 0000

: 0|1111 1111|000 0000 0000 0000 0000 0000

1|1111 1111|000 0000 0000 0000 0000 0000

Код в поле смещенного порядка, содержащий 1 во всех битах при ненулевой дробной части мантиссы означает, что формат содержит нечисловую величину (значения NaN – Not a Number – не число), т.е. символы, закодированные в поле дробной части мантиссы. Стандарт предоставляет конструктору возможность кодировать любую нечисловую информацию по его усмотрению, без каких либо ограничений. Значения NaN используют для записи в формат диагностической информации образующейся в процессе вычислений.

Типы данных представляемых в форматах приведены на рис.5-7.

Расширенные форматы. Кроме основных форматов стандарт предлагает применять одинарные и двойные расширенные форматы. Одинарный расширенный формат не обеспечивает больший диапазон значений, чем нерасширенный формат с двойной точностью.

В

Таблица 5.4

Параметр

Формат

Одинарный

Двойной

Двойной

расширенный

Длина мантиссы (бит)

24

53

≤ 64

Emax

+127

+1023

≤ +16383

Emin

–126

–1022

≥ –16382

Смещение порядка (bias)

+127

+1023

Не

регламентируется

Ширина порядка (бит)

8

11

≤ 15

Ширина формата (бит)

32

64

≤ 79

Диапазон

представляемых чисел

10-38; 10+38

10-308; 10+308

Не

регламентируется

Количество

значений порядка

254

2046

Не

регламентируется

Количество

значений мантиссы

223

252

Не

регламентируется

Количество различных

представимых величин

1.98231

1.99263

Не

регламентируется

табл.5.4 приведены ограничения на основные и расширенные форматы, накладываемые стандартом. Стандарт допускает в расширенных форматах избыточное кодирование некоторых величин, при условии, если избыточность будет незаметна пользователю. Для этого реализация должна присваивать каждой ненулевой величине уникальный код или не должна различать различные коды одной и той же ненулевой величины.

Реализация может резервировать некоторые битовые строки для особых целей, не описанных в стандарте. Если подобная комбинация выступает в роли операнда, результат операции стандартом не регламентируется.

Все реализации соответствующие стандарту должны поддерживать одинарный формат. Рекомендуется также поддержка расширенного формата с наибольшим диапазоном значений, и нет необходимости в этом случае поддерживать все другие расширенные форматы. Конструкторы могут, например, реализовывать три формата: основной одинарный, основной двойной и двойной расширенный с шириной формата 79.

Бесконечности и NaN могут быть операндами и результатами арифметических операций.

Значения или могут быть результатами выполнения операций над первыми тремя типами данных, если

  • выполняется деление на ноль операнда не равного нулю и отсутствует обработка этой исключительной ситуации, знак бесконечности определяется как сумма по модулю 2 знаков операндов;

  • не выполняется обработка исключительной ситуации переполнения при превышении результатом верхних границ диапазона чисел представимых в формате результата и результат округления равен (см. раздел 3.3.2).

Е

Таблица 5.5

При сложении и вычитании

При умножении

При делении

x()=; ()()

x()=; ()()

x()=; ()()

x()=; ()()

Здесь x любое число, включая 0

y()=; ()()=

y()=; ()()=

y()=; ()()=

y()=; ()()=

Здесь y0

x/()=0; ()/0=

x/()=0; ()/0=

x/()=0; ()/0=

x/()=0; ()/0=

Здесь x0

сли одним из операндов является данное типа бесконечность, а другим – данное одного из первых трех типов, или оба операнда имеют тип бесконечность, то код результата определяют на основании следующих общепринятых правил приведенных в табл.5.5.

При выполнении операций с и с нулями существуют особые случаи. Например, или . В подобных особых случаях результат выполнения операции не является числом и для его представления использован тип не число (NaN).

Различается два подтипа NaN-значений, – сигнализирующее и простое. Оба подтипа в формате с плавающей точкой содержат в поле порядка код 11…1, а в поле мантиссы код отличный от нуля, который стандарт не регламентирует.

Выбор кодов в поле мантиссы для представления простых и сигнализирующих NaN-значений выполняет конструктор конкретной реализации. Не следует использовать бит знака числа как признак для распознавания сигнализирующих или простых NaN-значений, так как операция изменения знака числа изменяет знак NaN. Признаком типа NaN-значений может служить, например старший бит поля дробной части мантиссы.

В формате должны быть представлены хотя бы одно сигнализирующее и хотя бы одно простое NaN.

Оба подтипа могут быть результатами и операндами операции.

Появление в качестве операнда арифметической операции сигнализирующего NaN значения должно генерировать исключительную ситуацию невыполнимая операция. Для этого конструктор проектирует подсистему генерирования исключительной ситуации с учетом выбранных им кодов для представления сигнализирующих NaN. Значение сигнализирующего NaN удобно присваивать, например неинициализированным переменным, что позволит при попытке выполнить операцию с такой переменой прервать вычисления и выдать сообщение об этом событии.

Каждая операция, предполагаемый результат которой является числом с плавающей точкой, должна выдавать простой NaN как ее результат, если при выполнении операции складывается исключительная ситуация невыполнимая операция и обработка по прерыванию не выполняется.

В табл.5.6 приведены некоторые ситуации, в которых арифметические операции в качестве результата формируют простое NaN-значение, если обработка соответствующей исключительной ситуации не выполняется (сигнал прерывания заблокирован).

Существуют исключения из этого правила вызванные тем, что некоторые операции не позволяют в результат записать NaN. Такими операциями являются операции сравнения и пересылки, если пересылаются данные в длинном формате в короткий формат или из формата с плавающей точкой в формат не имеющий NaN. Эти операции при получении простого NaN на входе создают эффект подобный сигнальным NaN.

Появление в качестве операнда одного или пары простых NaN не должно генерировать исключительную ситуацию. Результатом выполнения операции будет простое NaN являющееся одним из исходных. Таким образом, простое NaN передается по цепочке операций в результат без промежуточных сообщений.

Простые NaN, по усмотрению разработчика, должны предоставлять ретроспективную диагностическую информацию, полученную от неверных или недоступных (недействительных) данных и результатов. Распространение диагностической информации требует, чтобы информация, содержащаяся в NaN, была передана в результат при выполнении арифметических операций и преобразования форматов с плавающей точкой.

В заключение к настоящему подразделу автор настоятельно рекомендует читателю в его практической деятельности связанной с проектированием систем удовлетворяющих требованиям некоторых стандартов руководствоваться их первоисточником и не доверять всякого рода пересказам (в том числе данному) и переводам. Порой, казалось бы, мало существенные неточности и недомолвки могут приводить к тому, что результат проектирования не будет удовлетворять требованиям стандарта и вся выполненная работа потребует дорогостоящей переработки. Пересказы и переводы полезны для первого вводного ознакомления. Помните, что их авторы, и автор настоящей работы в их числе, не несут юридической ответственности за достоверность и полноту описания. Юридическую ответственность несет автор проекта.