T'WIDTH Вырабатывает максимальную длину образа по всем значениям подтипа Т (образ — это последовательность символов, вырабатываемая ат­рибутом IMAGE, см. ниже). Вырабатывает нуль для пустого диапазона. Зна­чения этого атрибута имеют зпп универсальный _целый.

Все атрибуты второй группы — это функции с одним параметром. Соот­ветствующий фактический параметр обозначен ниже идентификатором X.

T'POS Параметр X должен быть значением базового типа Т. Тип резуль­тата — универсальный_целый. Результат — номер позиции для значения па­раметра.

T'VAL Параметр X может быть любого целого типа. Тип результата — базовый тип Т. По заданному значению X - номеру позиции - функция вы­рабатывает значение в этой позиции. Если соответствующее X — универсалы ное_целое значение — не принадлежит диапазону T'POS (T'BASE 'FIRST). . T'POS (T'BASE' LAST), то возбуждается исключение CONSTRAINT—ERROR.

T'SUCC Параметр X должен быть значением базового типа Т. Тип ре­зультата - базовый тип Т. Результат — значение с номером позиции, на еди­ницу большим номера позиции для значения X. Если X равен T'BASE'LAST, то возбуждается исключение CONSTRAINT-ERROR.

T'PRED Параметр X должен быть значением базового типа Т. Тип ре­зультата — базовый тип Т. Результат — значение с номером позиции, на еди­ницу меньшим номера позиции для значения X. Если X равно T'BASE'FIRST, то возбуждается исключение CONSTRAINT-ERROR.

T'lMAGE Параметр X должен быть значением базового типа Т. Тип ре­зультата — предопределенный тип STRING. Результат — образ значения X, т. е. последовательность символов, представляющих изображение значения. Образу целого значения соответствует десятичный литерал без подчеркива­ний, предшествующих нулей, порядка и пробелов справа, но с одним симво­лом минус или пробелом слева. Нижняя граница образа есть единица.

Образ литерала перечисления — это либо соответствующий идентифика­тор из прописных букв, либо соответствующий символьный литерал (вклю­чая два апострофа); пробелы не включаются ни слева, ни справа. Образ символа С, отличного от графического символа, зависит от реализации; должно выполняться равенство

С = CHARACTER' VALUE (CHARACTER'IMAGE (С)).

Т' VALUE Параметр X должен быть значением предопределенного типа STRING. Тип результата — базовый тип Т. Игнорируются любые пробелы слева и справа от последовательности символов, соответствующей пара­метру.

Если для перечислимого типа последовательность символов имеет син­таксис литерала перечисления и если этот литерал существует для базового типа Т, то результат - соответствующее значение пере;шслимого типа. Если для целого типа последовательность символов имеет синтаксис целого лите­рала с возможным знаком минус или плюс слева и если существует соответ­ствующее значение базового типа Т, то результат есть это значение. Во всех остальных случаях возбуждается исключение CONSTRAINT-ERROR.

Кроме того, для объекта А дискретного типа определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2).

Кроме базовых, операции над дискретными типами включают предоп­ределенные операции отношения. Для перечислимых типов операции вклю­чают литералы перечисления. Для логических типов включают предопреде­ленную унарную логическую операцию отрицания not и предопределенные логические операции. Для целых типов операции включают предопределен­ные арифметические операции: унарные и бинарные аддитивные операции — и +, все мультипликативные операции, унарную операцию abs и операцию возведения в степень.

Операции над подтипом — это операции над его базовым типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явно­го преобразования типа и атрибутов первой группы; результат каждой из этих операций зависит от подтипа (присваивание, проверка принадлежнос­ти, квалификация и преобразования включают проверку подтипа; атрибу­ты первой группы вырабатывают характеристику подтипа).

Примечание. Для подтипа дискретного типа переданные атрибутами SUCC, PRED, VAL и VALUE результаты не обязательно принадлежат подтипу; аналогично, факти­ческие параметры атрибутов POS, SUCC, PRED и IMAGE не обязаны принадлежать под­типу. Эти атрибуты удовлетворяют (при отсутствии исключения) следующим соотно­шениям:

Т' POS(T' SUCC (X)) = Т 'POS (X) + 1

Т' POS (T'PRED (X)) = Т' POS (X) - 1

Т' VAL (Т' POS (X)) = X

Т' POS (Т' VAL (К)) = К

Примеры:

, - - для типов и подтипов, описанных в разд. 3.5.1:

  • - ЦВЕТ' FIRST = БЕЛЫЙ, ЦВЕТ' LAST = ЧЕРНЫЙ,

  • - РАДУГА' FIRST = КРАСНЫЙ, РАДУГА' LAST = ГОЛУБОЙ,

  • - ЦВЕТ' SUCC (ГОЛУБОЙ), = РАДУГА' SUCC (ГОЛУБОЙ) = КОРИЧНЕВЫЙ,

  • - ЦВЕТ' POS (ГОЛУБОЙ) = РАДУГА' POS (ГОЛУБОЙ) = 4,

  • -ЦВЕТ'VAL (0) = РАДУГА'VAL (0) = БЕЛЫЙ.

  1. В е щ е с т в е н н ы е типы

Вещественные типы обеспечивают приближение вещественных чисел с относительной погрешностью для плавающих типов и с абсолютной погреш­ностью для фиксированных типов.

определение_вещественного_типа : : = ограничение—плавающего—типа I ограничение—фиксированного_типа

С каждым вещественным типом связан набор чисел, называемых мо­дельными числами. Границы ошибок в предопределенных операциях даны в терминах модельных чисел. Реализация типа должна включать по крайней мере эти модельные числа и представлять их точно.

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

Вещественные литералы - это литералы анонимного предопределенно­го вещественного типа, называемого в этом стандарте универсальным_ве­щественным. Другие вещественные типы не имеют литералов. Для каждого вещественного типа существует неявное преобразование, которое преобра­зует универсальное-вещественное значение в значение этого вещественного типа. Условия, в которых вызываются эти преобразования, описаны в разд. 4.6. Если универсальное -вещественное значение — хранимое число, то не­явное преобразование вырабатывает соответствующее значение; если оно принадлежит диапазону хранимых чисел, но не является хранимым числом, то преобразованное значение может быть любым значением в диапазоне, оп­ределенном ближайшими хранимыми предыдущим и следующим числами и содержащим данное универсальное-вещественное значение.

Выполнение операции вырабатывает значение вещественного типа и мо­жет возбудить исключение NUMERIC—ERROR, как поясняется в разд. 4.5.7, если операция не может выработать корректный результат (т. е. соответст­вующее одному из возможных математических результатов значение не принадлежит диапазону хранимых чисел); в частности, это исключение мо­жет быть возбуждено неявным преобразованием. Однако от реализации не требуется возбуждать исключение NUMERIC_ERROR, если операция — часть большего выражения, которое может быть корректно вычислено (см. 11.6).

Предвыполнение определения вещественного типа включает предвы- полнение ограничения плавающего или фиксированного типа и создает ве­щественный тип.

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

  1. Плавающие типы

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

ограничение плавающего__типа : : =

определение_точности_плавающего_типа

[ограничение_диапазона]

определение_точности_плавающего_типа : : =

digits сгагаческое__простое_выражение

Минимальное число значащих десятичных цифр определяется значением статического простого выражения в определении точности плавающего ти­па. Это значение должно быть некоторого целого типа и должно быть поло­жительным (ненулевым); в дальнейшем оно обозначено буквой Д. Если ог­раничение плавающего типа использовано для определения вещественного типа и включает ограничение диапазона, то каждая граница диапазона долж­на быть определена статическим выражением некоторого вещественного ти­па, но две границы не обязаны иметь один и тот же вещественный тип.

Для заданного основания определена следующая каноническая форма отличного от нуля модельного числа плавающего типа:

знак * мантисса * (основание ** порядок)

В этой форме: знак - либо +1, либо 1; мантисса выражена в системе

счисления, заданной основанием; порядок — целое число (возможно, отри­цательное) , такое, что целая часть мантиссы равна нулю, а первая цифра ее дробной части не равна нулю.

Число Д — минимальное требуемое число десятичных цифр после точки в десятичной мантиссе (т. е. если основание равно десяти). Значение Д, в свою очередь, определяет соответствующее число В — минимальное требуе­мое число двоичных цифр после точки в двоичной мантиссе (т. е. если осно­вание равно двум). Число В связано с Д и равно такому минимальному зна­чению, что относительная точность двоичной формы не меньше точности для десятичной формы. (Число В равно ближайшему целому, превышающему

(Д * log (10)/ iog (2)) + 1.)

Модельные числа, заданные определением точности плавающего типа, включают нуль и все числа, у которых двоичная каноническая форма имеет точно В цифр после точки в мантиссе и порядок в диапазоне —4 * В .. +4 * В. Гарантированная минимальная точность операций над плавающим типом оп­ределена в терминах его модельных чисел с ограничением плавающего типа, которое формирует соответствующее определение вещественного типа (см. 4.5.7).

Предопределенные плавающие типы включают тип FLOAT. Реализа­ция может иметь также предопределенные типы SHORT—FLOAT и LONG-FLOAT с точностью, (существенно) меньшей и большей соответст­венно, чем у FLOAT. Базовым типом каждого предопределенного плаваю­щего типа является он сам. Модельные числа каждого предопределенного плавающего типа определены числом Д десятичных цифр, вырабатываемых атрибутом DIGITS (см. 3.5.8).

Для каждого предопределенного плавающего типа (следовательно, и для каждого производного от него типа) набор хранимых чисел определен следующим образом. Хранимые числа имеют то же самое число цифр В ман­тиссы, как и модельные числа типа, а порядок в диапазоне — Е .. +Е, где Е зависит от реализации и равно по крайней мере 4 * В для модельных чисел. (Следовательно, хранимые числа включают модельные числа). Правила оп­ределения точности операций над модельными и хранимыми числами даны в разд. 4.5.7. Хранимые числа подтипа те же, что и для его базового типа.

Описание плавающего типа, представленное в одной из двух форм (т. е. с возможным ограничением диапазона, обозначенным квадратными скоб­ками, или без него):

type Т is digits Д [range Л . . П] ;

по определению эквивалентно следующим описаниям:

type плавающий_тип is new

предопределенный_плавающий_тип;

subtype Т is плавающий _тип digits Д

[range плавающий_тип (Л) .. плавающий_тип (П)] ;

где плавающий_тип является анонимным, а предопределенный плавающий тип неявно выбран реализацией так, что его модельные числа включают мо­дельные числа, определенные значением Д; кроме того, если добавлен диа­пазон Л . . П, то Л и П должны принадлежать диапазону хранимых чисел. Описание плавающего типа неправильно, если ни один из предопределенных плавающих типов не удовлетворяет этим требованиям, кроме универ­сальный _вещественный. Максимальное число цифр, которое может быть задано определением точности плавающего типа, определяется именован­ным числом SYSTEM.MAX_DIGITS (см..13.7.1).

Предвыполнение описания плавающего типа состоит из предвыполне- ния эквивалентных описаний типа и подтипа.

Если ограничение плавающего типа следует за обозначением типа в ука­зании подтипа, то обозначение типа должно задавать плавающий тип или подтип. Ограничение плавающего типа совместимо с обозначением типа, только если число Д в определении точности плавающего типа не больше со­ответствующего числа Д для типа или подтипа в обозначении типа. Кроме того, если ограничение плавающего типа включает ограничение диапазона, то ограничение плавающего типа совместимо с обозначением типа, только если ограничение диапазона совместимо с обозначением типа.

Предвыполнение такого указания подтипа включает предвыполнение ограничения диапазона, если оно есть; оно создает подтип плавающего ти­па, модельные числа которого определены соответствующим определением точности плавающего типа. Значение плавающего типа принадлежит плаваю­щему подтипу тогда и только тогда, когда оно принадлежит диапазону под­типа.

Одни и те же арифметические операции предопределены для всех плава­ющих типов (см. 4.5).

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

Примеры:

type КОЭФФИЦИЕНТ is digits 10 range -1.0. .1.0;

type ВЕЩЕСТВ is digits 8;

type МАССА is digits 7 range 0.0 . . 1.0E35;

subtype КОРОТКИЙ КОЭФФ is КОЭФФИЦИЕНТ digits 5;

  • - подтип с меньшей точностью