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

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_simple_expression [range_constraint]

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

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

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

В fixed_point_definition или digits_constraint выражения, указанные после ключевых слов 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 также определяет ограниченный первый подтип типа, где каждая граница его диапазона определяется как ближе к нулю:
  • значение преобразования в тип с фиксированной точкой соответствующего выражения real_range_specification;
  • соответствующая граница базового диапазона.
decimal_fixed_point_definition определяет десятичный тип с фиксированной точкой, чей базовый диапазон включает по крайней мере диапазон –(10**digits–1)*delta .. +(10**digits–1)*delta. decimal_fixed_point_definition также определяет ограниченный первый подтип типа. Если задан real_range_specification, границы первого подтипа задаются преобразованием значений выражений 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 — значение simple_expression. digits_constraint совместим с подтипом десятичного типа с фиксированной точкой, если значение simple_expression не превышает digits подтипа и если он задаёт (явным или неявным образом) диапазон, совместимый с подтипом.
Выполнение digits_constraint состоит из выполнения range_constraint, если таковой имеется. Если задан range_constraint, выполняется проверка, что границы диапазона находятся в диапазоне –(10**D–1)*delta .. +(10**D–1)*delta, где D — значение (статическое) simple_expression, указанного после ключевого слова digits. Если эта проверка не пройдена, поднимается исключение Constraint_Error.

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

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

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

Реализации разрешается поддерживать только small, являющиеся степенями двойки. В частности, могут быть запрещены все объявления десятичных типов с фиксированной точкой. Однако соответствие Приложению к системам обработки информации требует поддержки десятичных small и объявления десятичных типов с фиксированной точкой с digits до как минимум 18.
ПРИМЕЧАНИЕ Указанные границы могут находиться вне базового диапазона обычного типа с фиксированной точкой, чтобы спецификация диапазона могла быть задана естественным образом, например:
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;
END_OF_DOCUMENT_MARKER
-- Чистая дробь, которая требует всего доступного
-- пространства в слове, может быть объявлена как тип 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