Spec-Zone.ru › Ada 95
Справочник по Ada 95

3.5.9 Типы с фиксированной точкой

Тип с фиксированной точкой может быть обычным типом с фиксированной точкой или десятичным типом с фиксированной точкой. Граница погрешности типа с фиксированной точкой задается как абсолютное значение, называемое дельта типа с фиксированной точкой.

Синтаксис

fixed_point_definition ::= ordinary_fixed_point_definition | decimal_fixed_point_definition
ordinary_fixed_point_definition ::=
delta static_expression real_range_specification
decimal_fixed_point_definition ::=
delta static_expression digits static_expression [real_range_specification]
digits_constraint ::=
digits static_expression [range_constraint]

Правила разрешения имен

Для типа, определенного fixed_point_definition, дельта типа задается значением expression, указанным после зарезервированного слова delta; эта expression должна быть любого вещественного типа. Для типа, определенного decimal_fixed_point_definition (десятичный тип с фиксированной точкой), количество значащих десятичных цифр для его первого подтипа (digits первого подтипа) задается expression, указанным после зарезервированного слова digits; эта expression должна быть любого целого типа.

Правила легальности

В fixed_point_definition или digits_constraint, expressionы, заданные после зарезервированных слов delta и digits, должны быть статическими; их значения должны быть положительными.
Множество значений типа с фиксированной точкой включает целые кратные числу, называемому small типа. Для типа, определенного ordinary_fixed_point_definition (обычный тип с фиксированной точкой), small может быть указан в attribute_definition_clause (см. 13.3); если это указано, оно не должно быть больше дельта типа. Если не указано, small обычного типа с фиксированной точкой — это определяемая реализацией степень двойки, меньшая или равная дельта.
Для десятичного типа с фиксированной точкой small равно дельта; дельта должна быть степенью 10. Если указана real_range_specification, обе границы диапазона должны находиться в диапазоне -(10**digits-1)*delta .. +(10**digits-1)*delta.
fixed_point_definition не является законным, если реализация не поддерживает тип с фиксированной точкой с заданным small и указанным диапазоном или digits.
Для subtype_indication с digits_constraint, subtype_mark должен обозначать подтип десятичного типа с фиксированной точкой.

Статическая семантика

Основной диапазон (см. 3.5) типа с фиксированной точкой симметричен относительно нуля, за исключением, возможно, дополнительного отрицательного значения в некоторых реализациях.
ordinary_fixed_point_definition определяет обычный тип с фиксированной точкой, чья основная область включает по крайней мере все кратные small, находящиеся между границами, указанными в real_range_specification. Основной диапазон типа не обязательно включает указанные границы сами по себе. ordinary_fixed_point_definition также определяет ограниченный первый подтип типа, при этом каждая граница его диапазона задается ближайшим к нулю значением:
  • значения преобразования в тип с фиксированной точкой соответствующей expression из real_range_specification;
  • соответствующая граница основной области.
decimal_fixed_point_definition определяет десятичный тип с фиксированной точкой, чья основная область включает по крайней мере диапазон -(10**digits-1)*delta .. +(10**digits-1)*delta. decimal_fixed_point_definition также определяет ограниченный первый подтип типа. Если указана real_range_specification, границы первого подтипа задаются преобразованием значений expressionов real_range_specification. В противном случае диапазон первого подтипа составляет -(10**digits-1)*delta .. +(10**digits-1)*delta.

Динамическая семантика

Выполнение fixed_point_definition создает тип с фиксированной точкой и его первый подтип.
Для digits_constraint на подтипе десятичного типа с фиксированной точкой с заданной дельта, если у него нет range_constraint, то он задает неявный диапазон -(10**D-1)*delta .. +(10**D-1)*delta, где D — значение expression. digits_constraint совместим с подтипом десятичного типа с фиксированной точкой, если значение expression не превышает digits подтипа и если он задает (явно или неявно) диапазон, совместимый с подтипом.
Выполнение digits_constraint состоит из выполнения range_constraint, если таковой имеется. Если range_constraint задан, выполняется проверка, что границы диапазона обе находятся в диапазоне -(10**D-1)*delta .. +(10**D-1)*delta, где D — значение (статической) expression, заданной после зарезервированного слова digits. Если эта проверка завершается неудачно, генерируется ошибка Constraint_Error.

Требования к реализации

Реализация должна поддерживать по меньшей мере 24 бита точности (включая бит знака) для типов с фиксированной точкой.

Разрешения для реализации

Реализации разрешается поддерживать только small, являющиеся степенями двойки. В частности, могут быть запрещены все объявления десятичных типов с фиксированной точкой. Однако соответствие приложению Annex по информационным системам требует поддержки десятичных small и объявлений десятичных типов с фиксированной точкой с digits до 18 включительно.
ПРИМЕЧАНИЯ
36 Основной диапазон обычного типа с фиксированной точкой может не включать указанных границ самих по себе, чтобы спецификация диапазона могла быть задана естественным образом, например:
type Fraction is delta 2.0**(-15) range -1.0 .. 1.0;
При использовании оборудования с дополнением до двух такой тип может иметь 16-битовое знаковое представление, используя 1 бит для знака и 15 бит для дроби, что приводит к диапазону -1.0 .. 1.0-2.0**(-15).

Примеры

Примеры типов и подтипов с фиксированной точкой:
type Volt is delta 0.125 range 0.0 .. 255.0;
-- Чистая дробь, для которой требуется всё доступное
-- место в слове, может быть объявлена как тип Fraction:
type Fraction is delta System.Fine_Delta range -1.0 .. 1.0;
-- Fraction'Last = 1.0 - System.Fine_Delta
type Money is delta 0.01 digits 15; -- десятичный тип с фиксированной точкой
subtype Salary is Money digits 10;
-- Money'Last = 10.0**13 - 0.01, Salary'Last = 10.0**8 - 0.01


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API