Справочник Ada 2012
3.5.7 Типы с плавающей точкой
Для типов с плавающей точкой граница ошибки задаётся как относительная точность, задавая требуемое минимальное количество значащих десятичных цифр.
Синтаксис
указание_диапазона_вещественных_чисел ::=
range static_простое_выражение .. static_простое_выражение
range static_простое_выражение .. static_простое_выражение
Правила разрешения имён
Требуемая десятичная точность, которая является минимальным числом значащих десятичных цифр, требуемых для типа с плавающей точкой, задаётся значением выражения, указанного после ключевого слова digits. Это выражение ожидается как любого целочисленного типа.
Каждое простое_выражение в указании_диапазона_вещественных_чисел ожидается любого вещественного типа; типы не обязательно должны быть одинаковыми.
Правила легальности
Требуемая десятичная точность должна задаваться статическим выражением, значение которого положительно и не превышает System.Max_Base_Digits. Каждое простое_выражение в указании_диапазона_вещественных_чисел также должно быть статическим. Если указание_диапазона_вещественных_чисел опущено, требуемая десятичная точность не должна превышать System.Max_Digits.
Определение типа с плавающей точкой floating_point_definition является недопустимым, если реализация не поддерживает тип с плавающей точкой, удовлетворяющий требуемой десятичной точности и диапазону.
Статическая семантика
Множество значений для типа с плавающей точкой — это бесконечное множество рациональных чисел. Машинные числа типа с плавающей точкой — это значения типа, которые могут быть представлены точно в каждой переменной без ограничений типа.
Базовый диапазон (см. 3.5) типа с плавающей точкой симметричен относительно нуля, за исключением того, что в некоторых реализациях он может включать дополнительные отрицательные значения.
Базовая десятичная точность типа с плавающей точкой — это количество десятичных цифр точности, представимые в объектах типа. Безопасный диапазон типа с плавающей точкой — это часть его базового диапазона, для которого точность, соответствующая базовой десятичной точности, сохраняется всеми предопределёнными операциями.
Определение типа с плавающей точкой floating_point_definition определяет тип с плавающей точкой, базовая десятичная точность которого не меньше требуемой десятичной точности. Если указание диапазона вещественных чисел real_range_specification задано, то безопасный диапазон типа с плавающей точкой (и, следовательно, также его базовый диапазон) включает по крайней мере значения простых выражений, указанные в real_range_specification. Если real_range_specification не указан, безопасный (и базовый) диапазон типа включает по крайней мере значения диапазона –10.0**(4*D) .. +10.0**(4*D), где D — требуемая десятичная точность. Безопасный диапазон может также включать и другие значения. Атрибуты Safe_First и Safe_Last дают фактические границы безопасного диапазона.
Определение типа с плавающей точкой floating_point_definition также определяет первый подтип типа. Если указание диапазона вещественных чисел real_range_specification задано, подтип ограничен диапазоном, границы которого получены путём преобразования значений простых_выражений из real_range_specification в тип, который определяется. В противном случае подтип не ограничен.
Существует предопределённый, неограниченный подтип с плавающей точкой с именем Float, объявленный во видимой части пакета Standard.
Динамическая семантика
Выполнение определения типа с плавающей точкой floating_point_definition создаёт тип с плавающей точкой и его первый подтип.
Требования к реализации
В реализации, поддерживающей типы с плавающей точкой с 6 или более цифрами точности, требуемая десятичная точность для Float должна быть не менее 6.
Если для реализации предопределён Long_Float, то его требуемая десятичная точность должна быть не менее 11.
Разрешения для реализации
Реализация может предоставить дополнительные предопределённые типы с плавающей точкой, объявленные во видимой части Standard, чьи (неограниченные) первые подтипы имеют имена вида Short_Float, Long_Float, Short_Short_Float, Long_Long_Float и т. д. Разным предопределённым типам с плавающей точкой разрешается иметь одинаковую базовую десятичную точность. Однако точность Float не должна превышать точности Long_Float. Аналогично, точность Short_Float (если предоставляется) не должна превышать точность Float. Соответствующие рекомендации относятся ко всем другим предопределённым типам с плавающей точкой. Необязательно, чтобы для каждой отдельной базовой десятичной точности, поддерживаемой реализацией, существовал именованный тип с плавающей точкой.
Рекомендации для реализации
Реализация должна поддерживать Long_Float дополнительно к Float, если целевая машина поддерживает 11 или более цифр точности. Другие именованные подтипы с плавающей точкой для пакета Standard не рекомендуются. Вместо этого следует предоставить соответствующие именованные подтипы с плавающей точкой в библиотечном пакете Interfaces (см. B.2).
ПРИМЕЧАНИЯ
41 Если подтип с плавающей точкой неограничен, то присваивания переменным подтипа связаны только с Overflow_Checks, а не с Range_Checks.
Примеры
Примеры типов с плавающей точкой и подтипов:
type Коэффициент is digits 10 range -1.0 .. 1.0;
type Вещественное is digits 8;
type Масса is digits 7 range 0.0 .. 1.0E35;
type Масса is digits 7 range 0.0 .. 1.0E35;
subtype Вероятность is Вещественное range 0.0 .. 1.0; -- подтип с меньшим диапазоном