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) = БЕЛЫЙ.
В е щ е с т в е н н ы е типы
Вещественные типы обеспечивают приближение вещественных чисел с относительной погрешностью для плавающих типов и с абсолютной погрешностью для фиксированных типов.
определение_вещественного_типа : : = ограничение—плавающего—типа I ограничение—фиксированного_типа
С каждым вещественным типом связан набор чисел, называемых модельными числами. Границы ошибок в предопределенных операциях даны в терминах модельных чисел. Реализация типа должна включать по крайней мере эти модельные числа и представлять их точно.
С каждым вещественным типом также связан зависящий от реализации набор чисел, называемых хранимыми числами. Набор хранимых чисел вещественного типа должен включать по крайней мере набор модельных чисел типа. Допустимо, чтобы диапазон хранимых чисел был больше диапазона модельных чисел, но границы ошибок предопределенных операций над хранимыми числами определены теми же правилами, что и для модельных чисел. Хранимые числа по этой причине обеспечивают гарантированные границы ошибок для операций в зависящем от реализации диапазоне чисел; напротив, диапазон модельных чисел зависит только от определения вещественного типа и поэтому не зависит от реализации.
Вещественные литералы - это литералы анонимного предопределенного вещественного типа, называемого в этом стандарте универсальным_вещественным. Другие вещественные типы не имеют литералов. Для каждого вещественного типа существует неявное преобразование, которое преобразует универсальное-вещественное значение в значение этого вещественного типа. Условия, в которых вызываются эти преобразования, описаны в разд. 4.6. Если универсальное -вещественное значение — хранимое число, то неявное преобразование вырабатывает соответствующее значение; если оно принадлежит диапазону хранимых чисел, но не является хранимым числом, то преобразованное значение может быть любым значением в диапазоне, определенном ближайшими хранимыми предыдущим и следующим числами и содержащим данное универсальное-вещественное значение.
Выполнение операции вырабатывает значение вещественного типа и может возбудить исключение NUMERIC—ERROR, как поясняется в разд. 4.5.7, если операция не может выработать корректный результат (т. е. соответствующее одному из возможных математических результатов значение не принадлежит диапазону хранимых чисел); в частности, это исключение может быть возбуждено неявным преобразованием. Однако от реализации не требуется возбуждать исключение NUMERIC_ERROR, если операция — часть большего выражения, которое может быть корректно вычислено (см. 11.6).
Предвыполнение определения вещественного типа включает предвы- полнение ограничения плавающего или фиксированного типа и создает вещественный тип.
Примечание. Алгоритм, использующий только минимальные свойства чисел, которые гарантированы определением типа для модельных чисел, будет переносимым без каких-либо предосторожностей.
Плавающие типы
Для плавающих типов граница ошибки определяется заданием относительной погрешности в виде требуемого минимального числа значащих десятичных цифр.
ограничение плавающего__типа : : =
определение_точности_плавающего_типа
[ограничение_диапазона]
определение_точности_плавающего_типа : : =
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;
- подтип с меньшей точностью