Справочное руководство по Ada 95
A.5.3 Атрибуты типов с плавающей точкой
Статическая семантика
Для каждого подтипа S типа с плавающей точкой T определены следующие атрибуты, ориентированные на представление.
- S'Machine_Radix
- Возвращает основание аппаратного представления типа T. Значение этого атрибута имеет тип universal_integer.
Значения других атрибутов, ориентированных на представление типа с плавающей точкой, и атрибутов «примитивных функций» типа с плавающей точкой, описанных позже, определяются в терминах конкретного представления ненулевых значений, называемого канонической формой. Каноническая форма (для типа T) имеет вид
± мантисса · T'Machine_Radixэкспонента
где
± мантисса · T'Machine_Radixэкспонента
где
- мантисса — это дробь в системе счисления с основанием T'Machine_Radix, первая цифра которой не равна нулю, и
- экспонента — целое число.
- S'Machine_Mantissa
- Возвращает наибольшее значение p такое, что каждое значение, выразимое в канонической форме (для типа T), имеющее p-значную мантиссу и экспоненту между T'Machine_Emin и T'Machine_Emax, является машинным числом (см. 3.5.7) типа T. Этот атрибут возвращает значение типа universal_integer.
- S'Machine_Emin
- Возвращает наименьшее (наиболее отрицательное) значение экспоненты такое, что каждое значение, выразимое в канонической форме (для типа T), имеющее мантиссу из T'Machine_Mantissa цифр, является машинным числом (см. 3.5.7) типа T. Этот атрибут возвращает значение типа universal_integer.
- S'Machine_Emax
- Возвращает наибольшее (наиболее положительное) значение экспоненты такое, что каждое значение, выразимое в канонической форме (для типа T), имеющее мантиссу из T'Machine_Mantissa цифр, является машинным числом (см. 3.5.7) типа T. Этот атрибут возвращает значение типа universal_integer.
- S'Denorm
- Возвращает значение True, если каждое значение, выразимое в форме
± мантисса · T'Machine_RadixT'Machine_Emin
где мантисса — ненулевая T'Machine_Mantissa-значная дробь в системе счисления с основанием T'Machine_Radix, первая цифра которой равна нулю, является машинным числом (см. 3.5.7) типа T; в противном случае возвращает значение False. Значение этого атрибута имеет тип Boolean.
Значения, описанные формулой в определении S'Denorm, называются денормализованными числами. Ненулевое машинное число, которое не является денормализованным числом, является нормализованным числом. Нормализованное число x данного типа T считается представленным в канонической форме, когда оно выражено в канонической форме (для типа T) с мантиссой, имеющей T'Machine_Mantissa цифр; полученная форма — представление x в канонической форме.
- S'Machine_Rounds
- Возвращает значение True, если округление выполняется для неточных результатов каждой предопределённой операции, возвращающей результат типа T; в противном случае возвращает значение False. Значение этого атрибута имеет тип Boolean.
- S'Machine_Overflows
- Возвращает значение True, если переполнение и деление на ноль обнаруживаются и сообщаются путём поднятия исключения Constraint_Error для каждой предопределённой операции, возвращающей результат типа T; в противном случае возвращает значение False. Значение этого атрибута имеет тип Boolean.
- S'Signed_Zeros
- Возвращает значение True, если аппаратное представление типа T имеет возможность представления как положительных, так и отрицательных знаковых нулей, которые генерируются и используются предопределёнными операциями типа T, как указано в IEC 559:1989; в противном случае возвращает значение False. Значение этого атрибута имеет тип Boolean.
Для каждого значения x типа с плавающей точкой T нормализованная экспонента x определяется следующим образом:
- нормализованная экспонента нуля (по соглашению) равна нулю;
- для ненулевого x нормализованная экспонента x — это единственное целое число k такое, что T'Machine_Radixk-1 <= |x| < T'Machine_Radixk.
Для любого подтипа S типа с плавающей точкой T определены следующие атрибуты примитивных функций.
- S'Exponent
- S'Exponent обозначает функцию со следующим описанием:
function S'Exponent (X : T)
return universal_integer
return universal_integer
- Функция возвращает нормализованную экспоненту X.
- S'Fraction
- S'Fraction обозначает функцию со следующим описанием:
function S'Fraction (X : T)
return T
return T
- Функция возвращает значение X · T'Machine_Radix-k, где k — нормализованная экспонента X. Результат нуля, который может возникнуть только когда X равно нулю, имеет знак X.
- S'Compose
- S'Compose обозначает функцию со следующим описанием:
function S'Compose (Fraction : T;
Exponent : universal_integer)
return T
Exponent : universal_integer)
return T
- Пусть v — значение Fraction · T'Machine_RadixExponent-k, где k — нормализованная экспонента Fraction. Если v является машинным числом типа T или если |v| ≥ T'Model_Small, функция возвращает v; в противном случае она возвращает одно из машинных чисел типа T, прилегающих к v. Constraint_Error необязательно поднимается, если v находится за пределами базового диапазона S. Результат нуля имеет знак Fraction, когда S'Signed_Zeros равно True.
- S'Scaling
- S'Scaling обозначает функцию со следующим описанием:
function S'Scaling (X : T;
Adjustment : universal_integer)
return T
Adjustment : universal_integer)
return T
- Пусть v — значение X · T'Machine_RadixAdjustment. Если v — машинное число типа T или если |v| ≥ T'Model_Small, функция возвращает v; в противном случае она возвращает одно из машинных чисел типа T, прилегающих к v. Constraint_Error необязательно поднимается, если v находится за пределами базового диапазона S. Результат нуля имеет знак X, когда S'Signed_Zeros равно True.
- Для ненулевого Y, пусть v — значение X - n · Y, где n — целое число, ближайшее к точному значению X/Y; если |n - X/Y| = 1/2, то n выбирается чётным. Если v — машинный номер типа T, функция возвращает v; в противном случае — ноль. Ошибка Constraint_Error возникает, если Y равно нулю. Результат равен нулю со знаком X, когда S'Signed_Zeros равно True.
- S'Adjacent
- S'Adjacent обозначает функцию со следующим описанием:
function S'Adjacent (X, Towards : T)
return T
return T
- Если Towards = X, функция возвращает X; в противном случае возвращает машинный номер типа T, смежный с X в направлении Towards, если такой машинный номер существует. Если результат будет находиться вне базового диапазона S, возникает ошибка Constraint_Error. Когда T'Signed_Zeros равно True, результат равен нулю со знаком X. Когда Towards равно нулю, его знак не влияет на результат.
- S'Copy_Sign
- S'Copy_Sign обозначает функцию со следующим описанием:
function S'Copy_Sign (Value, Sign : T)
return T
return T
- Если значение Value ненулевое, функция возвращает результат, модуль которого равен модулю Value, а знак — знаку Sign; в противном случае — ноль. Ошибка Constraint_Error может быть вызвана, если результат находится вне базового диапазона S. Результат равен нулю со знаком Sign, когда S'Signed_Zeros равно True.
- S'Leading_Part
- S'Leading_Part обозначает функцию со следующим описанием:
function S'Leading_Part (X : T;
Radix_Digits : universal_integer)
return T
Radix_Digits : universal_integer)
return T
- Пусть v — значение T'Machine_Radixk-Radix_Digits, где k — нормализованный показатель степени X. Функция возвращает значение
- Floor(X/v) · v, когда X неотрицательно и Radix_Digits положительно;
- Ceiling(X/v) · v, когда X отрицательно и Radix_Digits положительно.
- Ошибка Constraint_Error возникает, когда Radix_Digits равно нулю или отрицательно. Результат равен нулю, что может произойти только когда X равно нулю, со знаком X.
- S'Machine
- S'Machine обозначает функцию со следующим описанием:
function S'Machine (X : T)
return T
return T
- Если X — машинный номер типа T, функция возвращает X; в противном случае — значение, полученное путем округления или усечения X до одного из смежных машинных номеров типа T. Ошибка Constraint_Error возникает, если округление или усечение X до точности машинных чисел приводит к значению вне базового диапазона S. Результат равен нулю со знаком X, когда S'Signed_Zeros равно True.
Для любого подтипа S типа с плавающей точкой T определены следующие атрибуты, ориентированные на модели.
- S'Model_Mantissa
- Если приложенный раздел по числовым методам не поддерживается, этот атрибут возвращает реализационно-зависимое значение, которое больше или равно Ceiling(d · log(10) / log(T'Machine_Radix)) + 1, где d — требуемая десятичная точность T, и меньше или равно значению T'Machine_Mantissa. Подробные требования, которые применяются к реализациям, поддерживающим приложенный раздел по числовым методам, см. в G.2.2. Значение этого атрибута имеет тип universal_integer.
- S'Model_Emin
- Если приложенный раздел по числовым методам не поддерживается, этот атрибут возвращает реализационно-зависимое значение, которое больше или равно значению T'Machine_Emin. Подробные требования, которые применяются к реализациям, поддерживающим приложенный раздел по числовым методам, см. в G.2.2. Значение этого атрибута имеет тип universal_integer.
- S'Model_Epsilon
- Возвращает значение T'Machine_Radix1 - T'Model_Mantissa. Значение этого атрибута имеет тип universal_real.
- S'Model_Small
- Возвращает значение T'Machine_RadixT'Model_Emin - 1. Значение этого атрибута имеет тип universal_real.
- S'Model
- S'Model обозначает функцию со следующим описанием:
function S'Model (X : T)
return T
return T
- Если приложенный раздел по числовым методам не поддерживается, смысл этого атрибута определяется реализацией; см. G.2.2 для определения, которое применяется к реализациям, поддерживающим приложенный раздел по числовым методам.
- S'Safe_First
- Возвращает нижнюю границу безопасного диапазона (см. 3.5.7) типа T. Если приложенный раздел по числовым методам не поддерживается, значение этого атрибута определяется реализацией; см. G.2.2 для определения, которое применяется к реализациям, поддерживающим приложенный раздел по числовым методам. Значение этого атрибута имеет тип universal_real.
- S'Safe_Last
- Возвращает верхнюю границу безопасного диапазона (см. 3.5.7) типа T. Если приложенный раздел по числовым методам не поддерживается, значение этого атрибута определяется реализацией; см. G.2.2 для определения, которое применяется к реализациям, поддерживающим приложенный раздел по числовым методам. Значение этого атрибута имеет тип universal_real.