Справочное руководство по Ada 2012
3.5.9 Типы с фиксированной точкой
Тип с фиксированной точкой — это либо обычный тип с фиксированной точкой, либо тип с фиксированной точкой в десятичной системе. Граница погрешности типа с фиксированной точкой задаётся как абсолютное значение, называемое дельта типа с фиксированной точкой.
Синтаксис
decimal_fixed_point_definition ::=
delta static_выражение digits static_выражение [указание_диапазона_вещественных_чисел]
delta static_выражение digits static_выражение [указание_диапазона_вещественных_чисел]
Правила разрешения имён
Для типа, определённого с помощью fixed_point_definition, дельта типа задаётся значением выражения, указанного после ключевого слова delta; ожидается, что это выражение будет любого вещественного типа. Для типа, определённого с помощью decimal_fixed_point_definition (тип с фиксированной точкой в десятичной системе), количество значащих десятичных цифр для первого подтипа (цифры первого подтипа) задаётся выражением, указанным после ключевого слова digits; ожидается, что это выражение будет любого целого типа.
Простое_выражение в digits_constraint ожидается любого целого типа.
Правила легальности
В fixed_point_definition или digits_constraint выражения, заданные после ключевых слов delta и digits, должны быть статическими; их значения должны быть положительными.
Множество значений типа с фиксированной точкой состоит из целых кратных числа, называемого small типа. Машинные числа типа с фиксированной точкой — это значения типа, которые можно точно представить в каждой безразмерной переменной типа. Для типа, определённого ordinary_fixed_point_definition (обычный тип с фиксированной точкой), small может быть указан с помощью attribute_definition_clause (см. 13.3); если указано, оно не должно превышать дельта типа. Если не указано, small обычного типа с фиксированной точкой — это определяемое реализацией степень двойки, меньшая или равная дельта.
Для типа с фиксированной точкой в десятичной системе small равно дельта; дельта должна быть степенью 10. Если задано указание_диапазона_вещественных_чисел, обе границы диапазона должны находиться в диапазоне –(10**цифры–1)*дельта .. +(10**цифры–1)*дельта.
fixed_point_definition не является допустимым, если реализация не поддерживает тип с фиксированной точкой с заданным small и указанным диапазоном или цифрами.
Для 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**цифры–1)*дельта .. +(10**цифры–1)*дельта. decimal_fixed_point_definition также определяет ограниченный первый подтип типа. Если задано указание_диапазона_вещественных_чисел, границы первого подтипа задаются преобразованием значений выражений real_range_specification. В противном случае диапазон первого подтипа составляет –(10**цифры–1)*дельта .. +(10**цифры–1)*дельта.
Динамическая семантика
Выполнение fixed_point_definition создаёт тип с фиксированной точкой и его первый подтип.
Для digits_constraint на подтипе с фиксированной точкой в десятичной системе с заданным дельта, если у него нет range_constraint, то он задаёт неявный диапазон –(10**D–1)*дельта .. +(10**D–1)*дельта, где D — значение simple_expression. digits_constraint совместим с подтипом с фиксированной точкой в десятичной системе, если значение simple_expression не больше цифр подтипа и если он задаёт (явно или неявно) диапазон, совместимый с подтипом.
Выполнение digits_constraint состоит из выполнения range_constraint, если таковой имеется. Если range_constraint задан, производится проверка, что границы диапазона находятся в диапазоне –(10**D–1)*дельта .. +(10**D–1)*дельта, где D — значение (статического) simple_expression, указанного после ключевого слова digits. Если эта проверка не пройдена, возникает Constraint_Error.
Требования к реализации
Реализация должна поддерживать как минимум 24 бита точности (включая бит знака) для типов с фиксированной точкой.
Разрешения для реализации
Реализации разрешается поддерживать только small, являющиеся степенью двойки. В частности, можно запретить все объявления типов с фиксированной точкой в десятичной системе. Тем не менее, соответствие Приложению по информационным системам требует поддержки десятичных small и объявлений типов с фиксированной точкой в десятичной системе с цифрами до как минимум 18.
ПРИМЕЧАНИЯ
44 Основной диапазон обычного типа с фиксированной точкой не обязательно включает сами указанные границы, чтобы указание диапазона можно было задать естественным образом, например:
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
-- пространства в слове, может быть объявлена как тип 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
subtype Salary is Money digits 10;
-- Money'Last = 10.0**13 – 0.01, Salary'Last = 10.0**8 – 0.01