Руководство по Ada (Ada 2022)
G.2.1 Модель плавающей точки арифметики
В строгом режиме предопределенные операции типа с плавающей точкой должны удовлетворять требованиям точности, указанным здесь, и должны избегать или сигнализировать о переполнении в описанных ситуациях. Это поведение представлено в виде модели арифметики с плавающей точкой, основанной на понятии канонической формы (см. A.5.3).
Статическая семантика
С каждым типом с плавающей точкой связан бесконечный набор модельных чисел. Модельные числа типа используются для определения требований к точности, которые должны быть удовлетворены определенными предопределенными операциями типа; с помощью определенных атрибутов модельных чисел они также используются для объяснения значения объявленного пользователем типа с плавающей точкой. Модельные числа производного типа — это модельные числа родительского типа; модельными числами подтипа являются модельными числами его типа.
Модельные числа типа с плавающей точкой T — это ноль и все значения, выразимые в канонической форме (для типа T), в которой мантисса имеет T'Model_Mantissa цифр, а экспонента имеет значение, большее или равное T'Model_Emin. (Эти атрибуты определены в G.2.2.)
Модельный интервал типа с плавающей точкой — это любой интервал, границы которого являются модельными числами типа. Модельный интервал типа T, ассоциированный со значением v, — это наименьший модельный интервал T, который включает v. (Модельный интервал, связанный с модельным числом типа, состоит только из этого числа.)
Требования к реализации
Требования к точности для оценки некоторых предопределенных операций типов с плавающей точкой следующие.
Интервал операнда — это модельный интервал, типа, указанного для операнда операции, связанный со значением операнда.
Для любой предопределенной арифметической операции, результатом которой является тип с плавающей точкой T, требуемые границы результата задаются модельным интервалом T (называемым интервалом результата), определенным в терминах значений операндов следующим образом:
- Интервал результата — это наименьший модельный интервал T, который включает минимум и максимум всех значений, полученных путем применения (точной) математической операции к значениям, произвольно выбранным из соответствующих интервалов операндов.
Интервал результата возведения в степень получается путем применения вышеуказанного правила к последовательности умножений, определяемой показателем степени, предполагая произвольное объединение множителей, и к окончательному делению в случае отрицательной степени.
Интервал результата преобразования числового значения в тип с плавающей точкой T — это модельный интервал T, связанный со значением операнда, за исключением случаев, когда исходное выражение имеет тип с фиксированной точкой со small, которое не является степенью T'Machine_Radix, или является фиксированным умножением или делением, у одного из операндов которых small не является степенью T'Machine_Radix; в этих случаях интервал результата определяется реализацией.
Для любой из вышеперечисленных операций реализация должна предоставить значение, которое принадлежит интервалу результата, когда обе границы интервала результата находятся в безопасном диапазоне типа результата T, как определено значениями T'Safe_First и T'Safe_Last; в противном случае
- если T'Machine_Overflows равно True, реализация должна либо предоставить значение, принадлежащее интервалу результата, либо вызвать Constraint_Error;
- если T'Machine_Overflows равно False, результат определяется реализацией.
Для любого предопределенного отношения к операндам типа с плавающей точкой T реализация может предоставить любое значение (то есть либо True, либо False), полученное путем применения (точного) математического сравнения к произвольно выбранным значениям из соответствующих интервалов операндов.
Результат проверки на принадлежность определяется в терминах сравнения значения операнда с нижней и верхней границами заданного диапазона или метки типа (применяются обычные правила к этим сравнениям).
Разрешения для реализации
Если базовое аппаратное обеспечение с плавающей точкой реализует деление как умножение на обратное значение, интервал результата для деления (и возведения в степень с отрицательной степенью) определяется реализацией.