Под скалярными типами подразумеваются перечислимые, целые и вещественные типы. Перечислимые и целые типы называются дискретными типами; каждое значение дискретного типа имеет номер позиции — целое значение. Целые и вещественные типы называются числовыми типами. Все скалярные типы упорядочены, т.е. для их значений предопределены все операции отношения.
ограничение-диапазона ::= range диапазон диапазон ::= атрибут-диапазона |простое-выражение .. простое-выражение
Диапазон определяет подмножество значений скалярного типа. Диапазон L. .R определяет значения от L до R включительно, если истинно отношение L < = R. Значения L и R называются соответственно нижней границей и верхней границей диапазона. Значение V удовлетворяет ограничению диапазона, если оно принадлежит диапазону; говорят, что значение V принадлежит диапазону, если одновременно истинны отношения L<=V и V<=R. Пустой диапазон — это диапазон, для которого истинно отношение R < L; пустому диапазону не принадлежит никакое значение. Операции < = и < в вышеприведенных определениях являются предопределенными операциями над скалярными типами.
Если ограничение диапазона используется в указании подтипа либо непосредственно, либо как часть ограничения плавающего или фиксированного типа, тип простых выражений (а также границ атрибута диапазона) должен быть тем же, что и базовый тип в обозначении типа указания подтипа. Ограничение диапазона совместимо с подтипом, если каждая граница диапазона принадлежит подтипу или если ограничение диапазона определяет пустой диапазон; иначе ограничение диапазона не совместимо с подтипом.
Предвыполнение ограничения диапазона состоит из вычисления диапазона. Вычисление диапазона определяет его нижнюю и верхнюю границы. Если границы заданы простыми выражениями, вычисление диапазона вычисляет эти выражения в порядке, который не определен в языке.
Атрибуты
Для любого скалярного типа Т или для любого подтипа Т скалярного типа определены следующие атрибуты:
Т'FIRST |
Вырабатывает значение нижней границы Т. Значение этого атрибута имеет тип Т. |
Т'LAST |
Вырабатывает значение верхней границы Т. Значение этого атрибута имеет тип Т. |
Примечание. Индексирование и правила итерации используют значения дискретных типов.
Ссылки: атрибут 4.1.4, атрибут диапазона 3.6.2, вещественный тип 3.5.6, вычисление 4.5, индекс 3.6, обозначение типа 3.3.2, ограничение 3.3, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, оператор цикла 5.5, операция отношения 4.5, 4.5.2, ошибочный 1.6, перечислимый тип 3.5.1, простое выражение 4.4, удовлетворяет ограничению 3.3, указание подтипа 3.3.2, целый тип 3.5.4.
3.5.1. ПЕРЕЧИСЛИМЫЕ ТИПЫ
Определение перечислимого типа задает перечислимый тип
определение - перечислимого - типа:: =
(спецификация -литерала-перечисления (, спецификация - литерала - перечисления))
спецификация-литерала-перечисления ::= литерал-перечисления литерал-перечисления ::= идентификатор|символьный-литерал
Идентификаторы и символьные литералы, перечисленные в определении перечислимого типа, должны быть различными. Каждая спецификация литерала перечисления является его описанием; это описание эквивалентно описанию функции без параметров, обозначение которой — литерал перечисления, а тип результата — перечислимый тип. Предвыполнение определения перечислимого типа создает перечислимый тип; это Предвыполнение включает пред-выполнение каждой спецификации литерала перечисления.
Каждый литерал перечисления вырабатывает отличное от других перечислимое значение. Предопределенные операции отношения упорядоченности между перечислимыми значениями следуют порядку, соответствующему номерам позиций; номер позиции первого значения в списке литералов перечисления равен нулю; номер каждого следующего литерала перечисления на единицу больше номера предыдущего литерала в списке.
Если один и тот же идентификатор или символьный литерал задан в нескольких определениях перечислимого типа, соответствующие литералы называются совмещенными. В тексте программы тип совмещенного литерала перечисления должен быть определимым из контекста (см. 8.7).
Примеры:
type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN); type SUIT is (CLUBS, DIAMONDS, HEARTS, SPADES); type GENDER is (M, F); type LEVEL is (LOW, MEDIUM, URGENT); type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE, BROWN, BLACK); type LIGHT is (RED, AMBER, GREEN); -- RED И GREEN совмещеныtype HEXA is ('A', 'B', 'C', '0', 'E', 'F'); type MIXED is ('A', 'B', '*', B, NONE, '?', '%');subtype WEEKDAY is DAY range MON .. FRI; subtype MAJOR is SUIT range HEARTS .. SPADES: subtype RAINBOW is COLOR range RED .. BLUE; -- цвет, НО не свет
Примечание. Если литерал перечисления встречается в контексте, недостаточном для определения типа литерала, то один из путей разрешения неоднозначности — это применение квалифицированного выражения с именем перечислимого типа (см. 4.7).
Ссылки: идентификатор 2.3, имя 4.1, квалифицированное выражение 4.7, номер позиции 3.5, обозначение 6.1, операция отношения 4.5, 4.5.2, описание 3.1, определение типа 3.3.1, пред-выполнение 3.9, 6.1, символьный литерал 2.5, совмещение 6.6, 8.7, тип 3.3, функция 6.5.
3.5.2. СИМВОЛЬНЫЕ ТИПЫ
Перечислимый тип называется символьным, если хотя бы один из его Питералов перечисления является символьным литералом. Предопределенный тип CHARACTER — символьный тип, значения которого представляют собой 128 символов стандартного набора ASCII. Каждый из 95 графических символов этого символьного набора обозначен соответствующим символьным литералом.
Пример:
type ROMAN_DIGIT is (Т, 'V. 'X', 'L', 'С', 'D', 'М');
Примечание. Предопределенный пакет ASCII включает описания констант, обозначающих управляющие символы, а также констант, обозначающих графические символы, не входящие в основной набор символов.
Другой символьный набор, например EBCDIC, можно описать как символьный тип; внутренние коды символов можно задать спецификатором представления перечислимых, как пояснено в разд. 13.3.
Ссыпки: графический символ 2.1, идентификатор 2.8, константа 3.2.1, литерал 4.2, описание 3.1, основной символ 2.1, перечислимый тип 3.5.1, предопределенный пакет С, предопределенный тип С, символьный литерал 2.5, тип 3.3.
3.5.3. ЛОГИЧЕСКИЕ ТИПЫ
Существует предопределенный перечислимый тип, именуемый BOOLEAN. Он содержит два литерала FALSE и TRUE, упорядоченные соотношением FALSE < TRUE. Логический тип — это тип BOOLEAN или производный непосредственно или косвенно от логического типа.
Ссылки: литерал перечисления 3.5.1, операция отношения 4.5, 4.5.2, перечислимый тип 3.5.1, производный тип 3.4, тип 3.3.
3.5.4. ЦЕЛЫЕ ТИПЫ
Определение целого типа задает целый тип, набор значений которого включает значения заданного диапазона.
определение-целого-типа ::= ограничение-диапазона
Границы диапазона должны определяться статическими выражениями некоторого, не обязательно одного и того же, целого типа. (Допускаются отрицательные границы.) Описание типа в форме
type Т is range L .. R;
по определению эквивалентно следующим описаниям:
type целый- тип is new предопределенный-целый-тип;
subtype Т is целый-тип range целый- тип (L) .. целый-тип (R);
где целый-тип — это анонимный тип, а предопределенный целый тип выбран реализацией и содержит значения от L до R включительно. Описание целого типа неправильно, если ни один из предопределенных целых типов не удовлетворяет этому требованию, за исключением типа универсальный-целый. Предвыполнение описания целого типа состоит из предвыполне-ния эквивалентных описаний типа и подтипа.
Предопределенные целые типы включают тип INTEGER. Реализация может также иметь предопределенные типы SHORT-INTEGER и LONG-INTEGER, диапазоны которых соответственно (существенно) уже и шире, чем у типа INTEGER. Диапазон этих типов должен быть симметричным относительно нуля, кроме наименьшего из отрицательных значений, которое может существовать в некоторых реализациях. Базовым для каждого из этих типов является он сам.
Целые литералы — это литералы анонимного предопределенного целого типа, который в данном руководстве называется универсальным-целым. Другие целые типы не имеют литералов. Однако для каждого целого типа существует неявное преобразование универсального-целого значения в соответствующее значение (если оно есть) целого типа. Обстоятельства, в которых применяются такие неявные преобразования, описаны в разд. 4.6.
Номер позиции целого значения — это соответствующее значение типа универсальный-цепый.
Для всех целых типов предопределены одни и те же арифметические операции (см. 4.5). Исключение NUMERIC-ERROR возбуждается при выполнении операции (в частности, неявного преобразования), которая не может передать корректный результат (т.е. значение, соответствующее математическому результату, не является значением целого типа). Однако от реализации не требуется возбуждения исключения NUMERIC_ERROR, если операция является частью большего выражения, результат которого может быть вычислен корректно, как пояснено в разд. 11.6.
Примеры:
type PAGE_NUM is range 1 .. 2_000; type LINE_SIZE is range 1 .. MAX_LINE_SIZE;subtype SMAL_IINT is INTEGER range -10 .. 10; subtype COLUMN_PTR is LINESIZE range 1 .. 10: subtype BUFFER_SIZE is INTEGER range 0 .. МАХ;
Примечание. Имя в описании целого типа — это имя подтипа. С другой стороны, предопределенные операции над целым типом определяют результат, который принадлежит диапазону, определяемому родительским предопределенным типом; такой результат не обязательно принадлежит описанному подтипу, и попытка присвоить такой результат переменной целого подтипа возбуждает исключение CONSTRAINT_ERROR. Наименьшее (наибольшее по модулю отрицательное) значение, поддержанное реализацией для предопределенных целых типов, есть именованное число SYSTEM.MIN_INT, а наибольшее (из положительных) значение — SYSTEM.MAX_INT (см. 13.7).
Ссылки: анонимный тип 3.3.1, граница диапазона 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, исключение NUMERIC-ERROR 11.1, литерал 4.2, ограничение диапазона 3.5, описание подтипа 3.3.2, описание типа 3.3.1, определение типа 3.3.1, предопределенная операция 4.5, предопределенный пакет системы 13.7, преобразование 4.6, принадлежит подтипу 3.3, родительский тип 3.4, статическое выражение 4.9, тип 3.3, универсальный тип 4.10, целый литерал 2.4.
3.5.5. ОПЕРАЦИИ НАД ДИСКРЕТНЫМИ ТИПАМИ
Базовые операции над дискретными типами включают присваивание, проверку на принадлежность и квалификацию; для логических типов — управление с промежуточной проверкой;для целого типа — явное преобразование значений других числовых типов к целому типу и неявное преобразование значения типа универсальный-целый к значению заданного типа.
Для каждого дискретного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом перечислении Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений для Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. Эта группа включает атрибут ВАЗЕ (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и атрибут WIDTH, определенный следующим образом:
T'WIDTH |
Вырабатывает максимальную длину образа по всем значениям подтипа Т {образ — это последовательность символов, вырабатываемая атрибутом IMAGE, см. ниже). Вырабатывает нуль для пустого диапазона. Значения этого атрибута имеют тип универсальный-целый. |
Все атрибуты второй группы — это функции с одним параметром. Соответствующий фактический параметр обозначен ниже идентификатором X.
Т'РОS |
Параметр Х должен быть значением базового типа Т. Тип результата — универсальный-целый. Результат — номер позиции для значения параметра. |
T'VAL |
Параметр Х может быть любого целого типа. Тип результата — базовый тип Т. По заданному значению Х — номеру позиции — функция вырабатывает значение в этой позиции. Если соответствующее Х — универсальное-целое значение — не принадлежит диапазону T'POS(T'BASE'FIRST). .T'POS(T'BASE'LAST), то возбуждается исключение CONSTRAINT_ERROR. |
T'SUCC |
Параметр X должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу большим номера позиции для значения X. Если Х равен T'BASE'LAST, то возбуждается исключениеCONSTRAINT_ERROR. |
T'PRED |
Параметр Х должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу меньшим номера позиции для значения X. Если Х равно T'BASE'FIRST, то возбуждается исключение CONSTRAINT - ERROR. |
T'IMAGE |
Параметр Х должен быть значением базового типа Т. Тип результата — предопределенный тип STRING. Результат — образ значения X, т.е. последовательность символов, представляющих изображение значения. Образу целого значения соответствует десятичный литерал без подчеркиваний, предшествующих нулей, порядка и пробелов справа, но с одним символом минус или пробелом слева. Нижняя граница образа есть единица. Образ литерала перечисления — это либо соответствующий идентификатор из прописных букв, либо соответствующий символьный литерал (включая два апострофа); пробелы не включаются ни слева, ни справа. Образ символа С, отличного от графического символа, зависит от реализации; должно выполняться равенство СНАRАСТЕR'VАLUЕ(СНАRАСТЕR'IМАGЕ(С))=С. |
T'VALUE |
Параметр Х должен быть значением предопределенного типа STRING. Тип результата — базовый тип Т. Игнорируются любые пробелы слева и справа от последовательности символов, соответствующих параметру. Если для перечислимого типа последовательность символов имеет синтаксис литерала перечисления и если этот литерал существует для базового типа Т, то результат — соответствующее значение перечислимого типа. Если для целого типа последовательность символов имеет синтаксис целого литерала с возможным знаком минус или плюс слева и если существует соответствующее значение базового типа Т, то результат есть это значение. Во всех остальных случаях возбуждается исключение CONSTRAINT_ERROR. |
Кроме того, для объекта А дискретного типа определены атрибуты A'SIZE и A'ADDRESS(см. 13.7.2).
Кроме базовых операции над дискретными типами включают предопределенные операции отношения. Для перечислимых типов операции включают литералы перечисления. Для логических типов операции включают предопределенную унарную логическую операцию отрицания not и предопределенные логические операции. Для целых типов операции включают предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, все мультипликативные операции, унарную операцию abs и операцию возведения встепень.
Операции над подтипом — это операции над его базовым типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования типа и атрибутов первой группы; результат каждой из этих операций зависит от подтипа (присваивание, проверка принадлежности, квалификация и преобразование включают проверку подтипа; атрибуты первой группы вырабатывают характеристику подтипа).
Примечание. Для подтипа дискретного типа переданные атрибутами SUCC, PRED, VAL и VALUE результаты не обязательно принадлежат подтипу; аналогично фактические параметры атрибутов POS, SUCC, PRED и IMAGE не обязаны принадлежать подтипу. Эти атрибуты удовлетворяют (при отсутствии исключения) следующим соотношениям:
T'POS(T'SUCC(X)) = T'POSfX) + 1T'POS(T'PRED(X)) = T'POS(X) - 1T'VAL(T'POS(X)) = X T'POS(T'VAL(N)) = NПримеры: -- для типов и подтипов, описанных в 3.5.1-- COLOR'FIRST = WHITE, COLOR'LAST = BLACK -- RAINBOW'FIRST = RED, RAINBOW'LAST = BLUE-- COLOR'SUCC(BLUE) = RAINBOW'SUCC(BLUE) = BROWN -- COLOR'POS(BLUE) = RAINBOW'POS(BLUE) = 4 -- COLOR'VAL(O) = RAINBOW'VAL(O) = WHITE
Ссылки: атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, граница диапазона 3.5, графический символ 2.1, дискретный тип 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, квалифицированное выражение 4.7, литерал перечисления 3.5.1, логическая операция 4.5, 4.5.1, логический тип 3.5.3, мультипликативная операция 4.5, 4.5.5, номер позиции 3.5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 4.5.6, операция отношения 4.5, 4.5.2, операция отрицания 4.5, 4.5.6, операция управления с промежуточной проверкой 4.5, 4.5.1, подтип 3.3, предопределенная операция 4.5, предопределенный тип С, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, символьный литерал 2.5, строковый тип 3.6.3, тип 3.3, тип универсальный целый 3.5.4, унарная аддитивная операция 4.5, 4.5.4, универсальный тип 4.10, функция 6.5, целый тип 3.5.4, числовой литерал 2.4, числовой тип 3.3.
3.5.6. ВЕЩЕСТВЕННЫЕ ТИПЫ
Вещественные типы обеспечивают приближение вещественных чисел с относительной погрешностью для плавающих типов и с абсолютной погрешностью для фиксированных типов.
определение-вещественного-типа :: =
ограничение - плавающего - типа [ограничение - фиксированного - типа
С каждым вещественным типом связан набор чисел, называемых модельными числами. Границы ошибок в предопределенных операциях даны в терминах модельных чисел. Реализация типа должна включать по крайней мере эти модельные числа и представлять их точно.
С каждым вещественным типом связан зависящий от реализации набор чисел, называемых хранимыми числами. Набор хранимых чисел вещественного типа должен включать по крайней мере набор модельных чисел типа. Допустимо, чтобы диапазон хранимых чисел был больше диапазона модельных чисел, но границы ошибок предопределенных операций над хранимыми числами определены теми же правилами, что и для модельных чисел. Хранимые числа по этой причине обеспечивают гарантированные границы ошибок для операций над зависящим от реализации диапазоном чисел; напротив, диапазон модельных чисел зависит только от определения вещественного типа и поэтому не зависит от реализации.
Вещественные литералы — это литералы анонимного предопределенного вещественного типа, называемого в этом руководстве универсальным-вещественным. Другие вещественные типы не имеют литералов. Для каждого вещественного типа существует неявное преобразование, которое преобразует универсальное-вещественное значение в значение этого вещественного типа. Условия, в которых вызываются эти преобразования, описаны в разд. 4.6. Если универсальное-вещественное значение — хранимое число, то неявное преобразование вырабатывает соответствующее значение; если оно принадлежит диапазону хранимых чисел, но не является хранимым числом, то преобразуемое значение может быть любым значением в диапазоне, определенном ближайшими хранимыми предыдущим и последующим числами универсального-вещественного значения.
Выполнение операции типа вырабатывает значение вещественного типа и может возбудить исключение NUMERIC_ERROR, как поясняется в разд. 4.5.7, если она не может вырабатывать корректный результат (т.е. соответствующее одному из возможных математических результатов значение не принадлежит диапазону хранимых чисел); в частности, это исключение может быть возбуждено неявным преобразованием. Однако от реализации не требуется возбуждать исключение NUMERIC_ERROR, если операция — часть большего выражения, которое может быть корректно вычислено (см. 11.6).
Предвыполнение определения вещественного типа включает предвыполнение ограничения плавающего или фиксированного типа и создает вещественный тип.
Примечание. Алгоритм, использующий только минимальные свойства чисел, которые гарантированы определением типа для модельных чисел, будет переносимым без каких-либо предосторожностей.
Ссылки: вещественный литерал 2.4, исключение NUMERIC_ERROR 11.1, литерал 4.2, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5,7, определение типа 3.3.1, предопределенная операция 3.3.3, предвыполнение 3.9, преобразование 4.6, тип 3.3, универсальный тип 4.10.
3.5.7. ПЛАВАЮЩИЕ ТИПЫ
Для плавающих типов граница ошибки определяется заданием относительной погрешности в виде требуемого минимального числа значащих десятичных цифр.
ограничение-плавающего-типа ::=
определение - точности - плавающего - типа [ограничение - диапазона] определение - точности - плавающего - типа:: = digits статическое- простое - выражение
Минимальное число значащих десятичных цифр определяется значением статического простого выражения в определении точности плавающего типа. Это значение должно быть некоторым целым типом и должно быть положительным (ненулевым); в дальнейшем оно обозначено буквой D. Если ограничение плавающего типа использовано как определение вещественного типа и включает ограничение диапазона, то каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но две границы не обязаны иметь один и тот же вещественный тип.
Для данного основания определена следующая каноническая форма отличного от нуля модельного числа плавающего типа:
знак*мантисса*(основание**порядок)
В этой форме: знак — либо +1, либо -1; мантисса выражена в системе счисления, заданной основанием; порядок — целое число (возможно, отрицательное), такое, что целая часть мантиссы равна нулю, а первая цифра ее дробной части не равна нулю.
Число D — минимальное требуемое число десятичных цифр после точки в десятичной мантиссе (т.е.' если основание равно десяти). Значение D в свою очередь определяет число В — минимальное требуемое число двоичных цифр после точки в двоичной мантиссе (т.е. если основание равно двум). Число В связано с D и равно такому минимальному значению, что относительная точность двоичной формы не меньше точности для десятичной формы. (Число В равно ближайшему целому, превышающему (D*log(10)/log(2)) +1.)
Модельные числа, заданные определением точности плавающего типа, включают нуль и все числа, у которых двоичная каноническая форма имеет точно В цифр после точки в мантиссе и порядок в диапазоне -4*В.. +4*В. Гарантированная минимальная точность операций над плавающим типом определена в терминах его модельных чисел с ограничением плавающего типа, которое формирует соответствующее определение вещественного типа (см. 4.5.7).
Предопределенные плавающие типы включают тип FLOAT. Реализация может иметь также предопределенные типы SHORT_FLOAT и LONG_FLOAT с точностью (существенно) меньшей и большей соответственно, чем у FLOAT. Базовым типом каждого предопределенного плавающего типа является он сам. Модельные числа каждого предопределенного плавающего типа определены числом D десятичных цифр, вырабатываемых атрибутом DIQITS (см. 3.5.8).
Для каждого предопределенного плавающего типа (а следовательно, и для каждого производного от него типа) набор хранимых чисел определен следующим образом. Хранимые числа имеют то же самое число цифр В мантиссы, что и модельные числа типа, а порядок — в диапазоне -Е.. +Е, где Е зависит от реализации и равно по крайней мере 4*В для модельных чисел. (Следовательно, хранимые числа включают модельные числа.) Правила определения точности операций над модельными и хранимыми числами Даны в разд. 4.5.7. Хранимые числа подтипа те же, что и для его базового типа.
Описание плавающего типа, представленное в одной из двух форм (т.е. с возможным ограничением диапазона, обозначенным квадратными скобками, или без него):
type Т is digits D [range L .. R];
по определению эквивалентно следующим описаниям:
type плавающий - тип is new предопределенный-плавающий-тип; subtype T is плавающий-тип digits D [range плавающий-тип (L). .плавающий -тип (R)];
где плавающий-тип является анонимным, а предопределенный плавающий тип неявно выбран реализацией так, что его модельные числа определяются значением D; кроме того, если добавлен диапазон L.-R, то L и R должны принадлежать диапазону хранимых чисел. Описание плавающего типа неправильно, если ни один из предопределенных плавающих типов не удовлетворяет этим требованиям, кроме типа универсальный-вещественный. Максимальное число цифр, которое может быть задано определением точности плавающего типа, определяется именованным числом SYSTEM.MAX_DIGITS (см. 13.7.1).
Предвыполнение описания плавающего типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение плавающего типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать плавающий тип или подтип. Ограничение плавающего типа совместимо с обозначением типа, только если число D в определении точности плавающего типа не больше соответствующего числа D для типа или подтипа в обозначении типа. Кроме того, если ограничение плавающего типа включает ограничение диапазона, то ограничение плавающего типа совместимо с обозначением типа, только если ограничение диапазона совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает подтип плавающего типа, модельные числа которого определены соответствующим определением точности плавающего типа. Значение плавающего типа принадлежит плавающему подтипу тогда у только тогда, когда оно принадлежит диапазону подтипа.
Одни и те же арифметические операции предопределены для всех плавающих типов (см. 4.5).
Примечание. Ограничение диапазона допустимо в указании плавающего подтипа непосредственно после обозначения типа либо как часть ограничения плавающего типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 35). Наложение ограничения плавающего типа на обозначение типа в указании подтипа не может уменьшить допустимый диапазон значений, если оно не включает ограничение диапазона (диапазон модельных чисел, которые соответствуют заданному числу цифр, может быть меньше, чем диапазон чисел обозначения типа). Принадлежащее плавающему подтипу значение не обязательно является модельным числом подтипа.
Примеры:
type COEFFICIENT is digits 10 range -1.0 .. 1.0;type REAL is digits 8; type MASS is digits 7 range 0.0 .. 1.0Е35;subtype SHORTCOEFF is COEFFICIENT digits 5; -- подтип с меньшей точностью subtype PROBABILITY is REAL range 0.0 .. 1.0; -- подтип с меньшим диапазоном
Примечание к примерам. Реализованная точность для типа COEFFICIENT — это точность предопределенного типа, имеющего по меньшей мере 10 цифр мантиссы. Следовательно, спецификация пяти цифр точности для подтипа SHORT_COEFF допустима. Наибольшее модельное число для типа MASS равно приблизительно 1.ОЕ21 и, следовательно, меньше, чем заданная верхняя граница, (1.0Е35). Следовательно, описание этого типа правильно, только если эта верхняя граница принадлежит диапазону хранимых чисел предопределенного плавающего типа, имеющего по меньшей мере 7 цифр точности.
Ссылки: анонимный тип 3.3.1, арифметическая операция 3.5.5, 4.5, вещественный тип 3.5.6, граница диапазона 3.5, граница ошибки 3.5.6, литерал с основанием 2.4.2, модельное число 3.5.6, обозначение типа 3.3.2, ограничение диапазона 3.5, операция 3.3., описание подтипа 3.3.2, описание типа 3,3.1, определение вещественного типа 3.5.6, принадлежит подтипу 3.3, подтип 3.3, порядок 2.4.1, Предвыполнение 3.1, 3.9, предопределенная операция 4.5, предопределенный тип С, производный тип 3.4, простое выражение 4.4, совместимый 3.3.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, хранимое число 3.5.6, целый тип 3.5.4, цифра 2.1.
3.5.8. ОПЕРАЦИИ НАД ПЛАВАЮЩИМИ ТИПАМИ
Базовые операции над плавающим типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого плавающего типа и неявное преобразование значений типа универсальный-вещественный в значения этого типа.
Кроме того, для каждого плавающего типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом представлении Т — это подтип (подтип Т) для любого свойства, зависящего от наложенных на Т ограничений; другие свойства формулируются через базовый тип Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К атрибутам этой группы относятся атрибут ВАSЕ (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2), а также следующие атрибуты:
T'DIGITS |
Вырабатывает число десятичных цифр в десятичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число D, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'MANTISSA |
Вырабатывает число двоичных цифр в двоичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'EPSILON |
Вырабатывает абсолютное значение разности между модельным числом 1.0 и следующим модельным числом подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'EMAX |
Вырабатывает наибольшее значение порядка двоичной канонической формы модельных чисел подтипа Т. (Этот атрибут вырабатывает произведение 4*В, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL |
Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE |
Вырабатывает наибольшее положительное модельное - число подтипа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
Атрибуты второй группы вырабатывают характеристики хранимых чисел и включают следующие атрибуты:
T'SAFE-EMAX |
Вырабатывает наибольшее значение порядка двоичной канонической формы хранимых чисел базового типа Т. (Этот атрибут вырабатывает число Е, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SAFE-SMALL |
Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип унивеосальный- вещественный. |
T'SAFE_LARGE |
Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный - вещественный. |
Кроме этого, для объекта А плавающего типа определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2). Для каждого плавающего типа существуют машинно-зависимые атрибуты, которые не относятся к модельным и хранимым числам. Они соответсвуют обозначениям атрибутовMACHINE_EMAX, MACHINE_EMIN, MACHINE_RADIX, MACHINE_MANTISSA,
MACHINE_ROUNDS и MACHINE_OVERFLOWS (см. 13.7.3).
Кроме базовых операций над плавающим типом определены операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции » и /, унарная операция abc и операция возведения в степень.
Операции над подтипом соответствуют операциям над типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результаты этих операций переопределены в терминах подтипа.
Примечание. Атрибуты ЕМАХ, SMALL, LARGE и EPSILON связаны с атрибутом MANTISSA следующими формулами:
Т'ЕМАХ = 4*T'MANTISSA
T'EPSILON = 2.0**(1 - T'MANTISSA)
T'SMALL = 2.0**(-Т'ЕМАХ - 1)
T'LARGE = 2.0**Т'ЕМАХ * (1.0 - 2.0**(-T'MANTISSA))
Атрибут MANTISSA, дающий число двоичных цифр в мантиссе, сам связан с атрибутом DIGITS.
Между характеристиками модельных и хранимых чисел справедливы следующие соотношения:
T'BASE_EMAX <= T'SAFE_EMAX T'BASE_SMALL >= T'SAFE_SMALL T'BASE_LARGE <= T'SAFE_LARGE
Атрибуты T'FIRST и T'LAST не обязательно вырабатывают модельные или хранимые числа. Если некоторое число цифр определено описанием типа или подтипа Т, то атрибут DIGITS вырабатывает это число.
Ссылки: арифметическая операция 3.5.5, 4.5, атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, границы диапазона 3.5, квалифицированное выражение 4.7, модельное число 3.5.6, мультипликативная операция 4.5, 4.5.5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 4.5.6, операция отношения 4.5, 4.5.2, плавающий тип 3.5.7, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, тип 3.3, тип универсальный вещественный 3.5.6, тип универсальный целый 3.5.4, унарная аддитивная операция 4.5, 4.5.4, универсальный тип 4.10, хранимое число 3.5.6, цифра 2.1, числовой тип 3.5.
3.5.9. ФИКСИРОВАННЫЕ ТИПЫ
Для фиксированных типов граница ошибки определяется абсолютной погрешностью, называемой дельтой фиксированного типа.
ограничение-фиксированного-типа :: =
определение - точности - фиксированного - типа [ограничение - диапазона]
определение - точности - фиксированного - типа:: = delta статическое- простое - выражение
Дельта определяется значением статического простого выражения в определении точности фиксированного типа. Это значение должно принадлежать некоторому вещественному типу и быть положительным (ненулевым). Если ограничение для фиксированного типа использовано как опеределение вещественного типа, то оно должно включать ограничение диапазона;каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но эти две границы не обязаны иметь один и тот же тип. Если ограничениедля фиксированного типа использовано в указании подтипа, то ограничение диапазона необязательно.
Для любого ненулевого модельного числа фиксированного типа определена каноническая форма. В этой форме: знак — это либо +1, либо -1; мантисса — положительное (ненулевое) целое; любое модельное число кратно некоторому положительному вещественному числу, называемому дискретом, определенному следующим образом:
знак*мантисса*дискрет
Для модельных чисел фиксированного типа дискрет выбран как наибольшая степень двух, которая не превышает дельту определения точности фиксированного типа. Дискрет можно также задать спецификатором длины (см. 13.2), в этом случае модельные числа кратны заданному значению. Гарантированная минимальная точность операций над фиксированным типом определена в терминах модельных чисел из ограничения для фиксированного типа, которое образует соответствующее определение вещественного типа (см. 4.5.7).
Для ограничения фиксированного типа с ограничением диапазона модельные числа включают нуль и все числа, кратные дискрету, мантисса которых может быть выражена точно В двоичными цифрами, а значение В выбрано как наименьшее целое число, для которого каждая граница заданного диапазона — либо модельное число, либо отличается не более чем на дискрет от модельного числа. Если ограничение для фиксированного типа не включает ограничение диапазона (это допустимо только после обозначения типа в указании подтипа), модельные числа определены дельтой определения точности фиксированного типа и диапазоном подтипа, заданного обозначением типа.
Реализация должна иметь по крайней мере один анонимный предопределенный фиксированный тип. Базовый тип каждого такого фиксированного типа — это сам этот тип. Модельные числа каждого предопределенного фиксированного типа включают нуль и все числа, для которых мантисса (в канонической форме) имеет число двоичных цифр, вырабатываемое атрибутом MANTISSA, и для которых дискрет имеет значение, возвращаемое атрибутом SMALL
Описание фиксированного типа в форме
type T is delta D range L .. R
по определению эквивалентно следующим описаниям:
type фиксированный-тип is new
предопределенный - фиксированный - тип;
subtype T is фиксированный-тип delta D range
фиксированный-тип (L) .. фиксированный-тип (R);
В этих описаниях фиксированный-тип — это анонимный тип, а предопределенный фиксированный тип неявно выбран реализацией так, чтобы его модельные числа включали описанные ограничением для фиксированного типа модельные числа (т. е. с помощью D, L и R, а возможно и спецификатора длины, определяющего дискрет).
Описание фиксированного типа неправильно, если не существует предопределенного типа, удовлетворяющего этим требованиям. Хранимые числа фиксированного типа — это модельные числа его базового типа.
Предвыполнение описания фиксированного типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение для фиксированного типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать фиксированный тип или подтип. Ограничение для фиксированного типа совместимо с обозначением типа, только если дельта из определения точности фиксированного типа не меньше дельты для типа или подтипа, заданного обозначением типа. Более того, если ограничение для фиксированного типа включает ограничение диапазона, то ограничение для фиксированного типа совместимо с обозначением типа, только если само ограничение совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает фиксированный подтип, модельные числа которого определены соответствующим ограничением для фиксированного типа, а также спецификатором длины, задающим дискрет, если он есть. Значение фиксированного типа принадлежит фиксированному подтипу тогда и только тогда, когда оно принадлежит диапазону, определенному подтипом.
Для всех фиксированных типов предопределены одни и те же арифметические операции (см. 4.5). Умножение и деление значений фиксированного типа дают результаты анонимного предопределенного фиксированного типа, который в данном стандарте называется универсальный-фиксированный; точность этого типа произвольна. Значения этого типа должны быть явно преобразованы в значения некоторого числового типа.
Примечание. Если S — подтип фиксированного типа или подтипа Т, то набор модельных чисел S — это подмножество модельных чисел Т. Если для Т был задан спецификатор длины, то Т и S имеют одно и то же значение дискрета. В противном случае поскольку дискрет равен степени двух, то дискрет для S равен дискрету для Т, умноженному на неотрицательную степень двух.
Ограничение диапазона допустимо в указании фиксированного подтипа либо непосредственно за обозначением типа, либо как часть ограничения для фиксированного типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 3.5).
Примеры:
type VOLT is delta 0.125 range 0.0 .. 255.0; subtype ROUGH_VOLTAGE is VOLT delta 1.0; — диапазон, как у VOLT-- Правильная дробь, требующая полного машинного слова в -- дополнительном коде, может быть описана как тип FRACTION:DEL : constant := 1.0/2**(WORD_LENGTH - 1); type FRACTION is delta DEL range -1.0 .. 1.0 - DEL;
Ссылки: анонимный тип 3.3.1, арифметическая операция 3.5.5, 4.5, базовый тип 3.3, вещественный тип 3.5.6, граница диапазона 3.5, граница ошибки 3.5.6, модельное число 3.5.6, обозначение типа 3.3.2, ограничение диапазона 3.5, операция 3.3, описание подтипа 3.3.2, описание типа 3.3.1, определение вещественного типа 3.5.6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, принадлежит подтипу 3.3, простое выражение 4.4, совместимо 3.3.2, спецификатор длины 13.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, хранимое число 3.5.6, числовой тип 3.
3.5.10. ОПЕРАЦИИ НАД ФИКСИРОВАННЫМИ ТИПАМИ
Базовые операции над фиксированным типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого фиксированного типа и неявное преобразование значений типа универсальный-вещественный в значение этого типа.
Кроме того, для каждого фиксированного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом представлении атрибутов Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений, наложенных Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К этой группе относятся атрибуты ВАЗЕ (см. 3.3.3), FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и следующие атрибуты:
T'DELTA |
Вырабатывает значение дельты, заданной в определении точности фиксированного типа для подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'MANTISSA |
Вырабатывает число двоичных цифр в мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. 3.5.9.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL |
Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE |
Вырабатывает наибольшее модельное число подтипа Т. Значение этого атрибута имеет тип универсальный,вещественный. |
T'FORE |
Вырабатывает минимальное число символов, необходимых для десятичного представления целой части любого значения подтипа Т в предположении, что это представление не включает порядок, но включает один символ, который является либо знаком минус, либо пробелом. (Это минимальное число не учитывает предшествующие нули и подчеркивания и по меньшей мере равно двум.) Значение этого атрибута имеет тип универсальный-целый. |
T'AFT |
Вырабатывает число десятичных цифр после точки, необходимых для обеспечения точности подтипа Т, если только DELTA подтипа Т не превышает 0.1, а для этого значения атрибут вырабатывает значение единицы. (T'AFT — это самое малое положительное целое К, для которого (10«*К)*Т'ОЕ1ТА больше или равно единице.) Значение этого атрибута имеет тип универсальный_целый. |
Вторая группа включает следующие атрибуты, которые вырабатывают характеристики хранимых чисел:
T'SAFE_SMALL |
Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'SAFE_LARGE |
Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
Кроме того, для объекта А фиксированного типа определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2). Для каждого фиксированного типа или подтипа Т существуют машинно-зависимые атрибуты T'MACHINE_ROUNDS и T'MACHINE_OVERFLOWS (см. 13.7.3).
Кроме базовых в состав операций над фиксированным типом входят операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции «и/и операция abs.
Операции над подтипом — это соответствующие операции над типом, кроме следующих:присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результат этих операций определен в терминах подтипа.
Примечание. Значение атрибута T'FORE зависит только от диапазона подтипа Т. Значение атрибута T'AFT зависит только от значения T'DELTA. Между атрибутами фиксированного типа существуют следующие соотношения:
T'LARGE = (2**Т'MANTISSА - 1) * T'SMALL T'SAFE_LARGE = T'BASE'LARGE T'SAFE_SMALL = T'BASE'SMALL
Ссылки: арифметическая операция 3.5.5, 4.5, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, граница диапазона 3.5, дельта 3.5.9, квалифицированное выражение 4.7, модельное число 3.5.6, мультипликативная операция 4.5, 4.5.5, объект 3.2, операция 3.3, операция abs 4.5, 4.5.6, операция отношения 4.5, 4.5.2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, унарная аддитивная операция 4.5, 4.5.4, универсальный вещественный тип 3.5.6, универсальный целый тип 3.5.4, фиксированный тип 3.5.9, хранимое число 3.5.6, числовой тип 3.5.