Справочное руководство Ada 2012
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 истинно, реализация должна либо предоставить значение, принадлежащее интервалу результата, либо вызвать Constraint_Error;
- если T'Machine_Overflows ложно, результат определяется реализацией.
Для любой предопределённой операции отношения над операндами типа с плавающей точкой T реализация может предоставить любое значение (т. е. либо True, либо False), полученное путём применения (точного) математического сравнения к произвольно выбранным значениям из соответствующих интервалов операндов.
Результат проверки на принадлежность определяется в терминах сравнения значения операнда с нижней и верхней границами заданного диапазона или метки типа (применяются обычные правила для этих сравнений).
Разрешения для реализации
Если базовое аппаратное обеспечение с плавающей точкой реализует деление как умножение на обратное значение, интервал результата для деления (и возведения в степень с отрицательной экспонентой) определяется реализацией.