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