Справочник по Ada (Ada 2022)
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.
± мантисса · 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.
S'Floor
S'Floor обозначает функцию со следующей спецификацией:
function S'Floor (X : T)
return T
return T
Функция возвращает значение Floor(X), то есть наибольшее (наиболее положительное) целое значение, меньшее или равное X. Когда X равно нулю, результат имеет знак X; в противном случае результат нуль имеет положительный знак.
S'Ceiling
S'Ceiling обозначает функцию со следующей спецификацией:
function S'Ceiling (X : T)
return T
return T
Функция возвращает значение Ceiling(X), то есть наименьшее (наиболее отрицательное) целое значение, большее или равное X. Когда X равно нулю, результат имеет знак X; в противном случае результат нуль имеет отрицательный знак, если S'Signed_Zeros равно True.
S'Rounding
S'Rounding обозначает функцию со следующей спецификацией:
function S'Rounding (X : T)
return T
return T
Функция возвращает целое значение, ближайшее к X, округляя прочь от нуля, если X лежит точно посередине между двумя целыми числами. Результат нуль имеет знак X, если S'Signed_Zeros равно True.
S'Unbiased_Rounding
S'Unbiased_Rounding обозначает функцию со следующей спецификацией:
function S'Unbiased_Rounding (X : T)
return T
return T
Функция возвращает целое значение, ближайшее к X, округляя к ближайшему четному целому числу, если X лежит точно посередине между двумя целыми числами. Результат нуль имеет знак X, когда S'Signed_Zeros равно True.
S'Machine_Rounding
S'Machine_Rounding обозначает функцию со следующей спецификацией:
function S'Machine_Rounding (X : T)
return T
return T
Функция возвращает целое значение, ближайшее к X. Если X лежит точно посередине между двумя целыми числами, возвращается одно из этих целых чисел, но какое из них возвращается, не определено. Результат нуль имеет знак X, когда S'Signed_Zeros равно True. Эта функция обеспечивает доступ к поведению округления, которое наиболее эффективно на целевом процессоре.
S'Truncation
S'Truncation обозначает функцию со следующей спецификацией:
function S'Truncation (X : T)
return T
return T
Функция возвращает значение Ceiling(X), если X отрицательно, и Floor(X) в противном случае. Результат нуль имеет знак X, если S'Signed_Zeros равно True.
S'Remainder
S'Remainder обозначает функцию со следующей спецификацией:
function S'Remainder (X, Y : T)
return T
return T
Для ненулевого 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.