Руководство по Ada (Ada 2022)
3.5.7 Типы с плавающей точкой
Для типов с плавающей точкой граница ошибки задаётся как относительная точность путём указания требуемого минимального числа значащих десятичных цифр.
Синтаксис
Правила разрешения имён
Требуемая десятичная точность, которая является минимальным числом значащих десятичных цифр, требуемых для типа с плавающей точкой, задаётся значением expression, указанным после ключевого слова digits. Ожидается, что эта expression будет иметь любой целочисленный тип.
Каждое simple_expression в real_range_specification должно быть любого вещественного типа; типы могут отличаться.
Правила легальности
Требуемая десятичная точность должна быть указана статической expression, значение которой положительно и не больше System.Max_Base_Digits. Каждое simple_expression в real_range_specification также должно быть статическим. Если real_range_specification опущена, требуемая десятичная точность должна быть не больше 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, подтип ограничен диапазоном, границы которого заданы преобразованием значений simple_expression в 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).
ПРИМЕЧАНИЕ Если подтип с плавающей точкой не ограничен, то присваивания переменным подтипа включают только Overflow_Checks, но никогда Range_Checks.
Примеры
Примеры типов и подтипов с плавающей точкой:
type Coefficient is digits 10 range -1.0 .. 1.0;
type Real is digits 8;
type Mass is digits 7 range 0.0 .. 1.0E35;
type Mass is digits 7 range 0.0 .. 1.0E35;
subtype Probability is Real range 0.0 .. 1.0;
-- подтип с меньшим диапазоном
-- подтип с меньшим диапазоном