Spec-Zone.ru › Ada 2012
Справочник Ada 2012

A.5.1 Элементарные функции

Подпрограммы в пакете Numerics.Generic_Elementary_Functions предоставляют определяемые реализацией приближения математических функций, известных как «элементарные функции». Аналогичные негенерические пакеты для каждого из предопределённых типов с плавающей точкой также предоставляются как потомки Numerics.

Статическая семантика

В общем пакете библиотек Numerics.Generic_Elementary_Functions содержится следующее объявление:
generic
type Float_Type is digits <>;

package Ada.Numerics.Generic_Elementary_Functions is
pragma Pure(Generic_Elementary_Functions);
function Sqrt (X : Float_Type'Base) return Float_Type'Base;
function Log (X : Float_Type'Base) return Float_Type'Base;
function Log (X, Base : Float_Type'Base) return Float_Type'Base;
function Exp (X : Float_Type'Base) return Float_Type'Base;
function "**" (Left, Right : Float_Type'Base) return Float_Type'Base;
function Sin (X : Float_Type'Base) return Float_Type'Base;
function Sin (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Cos (X : Float_Type'Base) return Float_Type'Base;
function Cos (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Tan (X : Float_Type'Base) return Float_Type'Base;
function Tan (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Cot (X : Float_Type'Base) return Float_Type'Base;
function Cot (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Arcsin (X : Float_Type'Base) return Float_Type'Base;
function Arcsin (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Arccos (X : Float_Type'Base) return Float_Type'Base;
function Arccos (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Arctan (Y : Float_Type'Base;
X : Float_Type'Base := 1.0)
return Float_Type'Base;
function Arctan (Y : Float_Type'Base;
X : Float_Type'Base := 1.0;
Cycle : Float_Type'Base) return Float_Type'Base;
function Arccot (X : Float_Type'Base;
Y : Float_Type'Base := 1.0)
return Float_Type'Base;
function Arccot (X : Float_Type'Base;
Y : Float_Type'Base := 1.0;
Cycle : Float_Type'Base) return Float_Type'Base;
function Sinh (X : Float_Type'Base) return Float_Type'Base;
function Cosh (X : Float_Type'Base) return Float_Type'Base;
function Tanh (X : Float_Type'Base) return Float_Type'Base;
function Coth (X : Float_Type'Base) return Float_Type'Base;
function Arcsinh (X : Float_Type'Base) return Float_Type'Base;
function Arccosh (X : Float_Type'Base) return Float_Type'Base;
function Arctanh (X : Float_Type'Base) return Float_Type'Base;
function Arccoth (X : Float_Type'Base) return Float_Type'Base;
end Ada.Numerics.Generic_Elementary_Functions;
Пакет библиотек Numerics.Elementary_Functions объявлен как чистый и определяет те же подпрограммы, что и Numerics.Generic_Elementary_Functions, за исключением того, что предопределённый тип Float систематически заменяется на Float_Type'Base.
Функции имеют свои обычные математические значения. Когда параметр Base указан, функция Log вычисляет логарифм по заданному основанию; в противном случае вычисляет натуральный логарифм. Когда параметр Cycle указан, параметр X прямых тригонометрических функций (Sin, Cos, Tan и Cot) и результаты обратных тригонометрических функций (Arcsin, Arccos, Arctan и Arccot) измеряются в единицах, таких, что полный цикл вращения имеет заданное значение; в противном случае они измеряются в радианах.
Вычисляемые результаты математически многозначных функций приводятся к однозначному виду с помощью следующих соглашений, которые предполагают главную ветвь:
  • Результаты функций Sqrt и Arccosh и оператора возведения в степень неотрицательны.
  • Результат функции Arcsin находится в квадранте, содержащем точку (1.0, x), где x – значение параметра X. Этот квадрант I или IV; таким образом, область значений функции Arcsin примерно от –π/2.0 до π/2.0 (–Cycle/4.0 до Cycle/4.0, если указан параметр Cycle).
  • Результат функции Arccos находится в квадранте, содержащем точку (x, 1.0), где x – значение параметра X. Этот квадрант I или II; таким образом, область значений функции Arccos от 0.0 до приблизительно π (Cycle/2.0, если указан параметр Cycle).
  • Результаты функций Arctan и Arccot находятся в квадранте, содержащем точку (x, y), где x и y – значения параметров X и Y соответственно. Это может быть любой квадрант (от I до IV), когда параметр X (соответственно Y) функции Arctan (соответственно Arccot) указан, но он ограничен квадрантами I и IV (соответственно I и II), когда этот параметр опущен. Таким образом, область значений, когда этот параметр указан, составляет приблизительно –π до π (–Cycle/2.0 до Cycle/2.0, если указан параметр Cycle); когда он опущен, область значений Arctan (соответственно Arccot) совпадает с областью значений Arcsin (соответственно Arccos), как указано выше. Когда точка (x, y) лежит на отрицательной оси x, результат приблизительно равен
π (соответственно –π) если знак параметра Y положителен (соответственно отрицателен), если Float_Type'Signed_Zeros равно True;
π, если Float_Type'Signed_Zeros равно False.
(В случае обратных тригонометрических функций, в которых результат, лежащий на оси или вблизи неё, может быть не точно представлен, приближение, присущее вычислению результата, может поместить его в соседний квадрант, близко к, но по другую сторону оси.)

Динамическая семантика

Исключение Numerics.Argument_Error генерируется, сигнализируя о значении параметра, выходящем за область определения соответствующей математической функции, в следующих случаях:
  • любой прямой или обратной тригонометрической функции со специфицированным циклом, когда значение параметра Cycle равно нулю или отрицательно;
  • функцией Log со специфицированным основанием, когда значение параметра Base равно нулю, единице или отрицательно;
  • функциями Sqrt и Log, когда значение параметра X отрицательно;
  • оператором возведения в степень, когда значение левого операнда отрицательно или когда оба операнда имеют значение ноль;
  • функциями Arcsin, Arccos и Arctanh, когда абсолютное значение параметра X превышает единицу;
  • функциями Arctan и Arccot, когда параметры X и Y оба имеют значение ноль;
  • функцией Arccosh, когда значение параметра X меньше единицы; и
  • функцией Arccoth, когда абсолютное значение параметра X меньше единицы.
Исключение Constraint_Error генерируется, сигнализируя о полюсе математической функции (аналогично делению на ноль), в следующих случаях, при условии, что Float_Type'Machine_Overflows равно True:
  • функциями Log, Cot и Coth, когда значение параметра X равно нулю;
  • оператором возведения в степень, когда значение левого операнда равно нулю, а значение показателя степени отрицательно;
  • функцией Tan со специфицированным циклом, когда значение параметра X является нечётным кратным четверти цикла;
  • функцией Cot со специфицированным циклом, когда значение параметра X равно нулю или кратно половине цикла; и
  • функциями Arctanh и Arccoth, когда абсолютное значение параметра X равно единице.
Constraint_Error также может быть поднято, когда конечный результат переполняется (см. G.2.4); это может произойти для значений параметров, достаточно близких к полюсам, и, в случае некоторых функций, для значений параметров с достаточно большими величинами. Если Float_Type'Machine_Overflows равно False, то результат в полюсах не определён.
Когда один параметр функции с несколькими параметрами представляет собой полюс, а другой находится вне области определения функции, имеет приоритет последнее (т.е., генерируется Numerics.Argument_Error).

Требования к реализации

При реализации Numerics.Generic_Elementary_Functions диапазон промежуточных значений, допускаемых во время вычисления конечного результата, не должен зависеть от каких-либо ограничений диапазона типа Float_Type.
В следующих случаях вычисление элементарной функции должно давать предписанный результат, при условии, что предыдущие правила не требуют, чтобы было возбуждено исключение:
  • Когда параметр X имеет значение ноль, функции Sqrt, Sin, Arcsin, Tan, Sinh, Arcsinh, Tanh и Arctanh дают результат ноль, а функции Exp, Cos и Cosh дают результат единицы.
  • Когда параметр X имеет значение единица, функция Sqrt даёт результат единица, а функции Log, Arccos и Arccosh дают результат ноль.
  • Когда параметр Y имеет значение ноль, а параметр X имеет положительное значение, функции Arctan и Arccot дают результат ноль.
  • Результаты функций Sin, Cos, Tan и Cot со специфицированным циклом являются точными, когда математический результат равен нулю; для первых двух – также точные, когда математический результат равен ± 1.0.
  • Возведение в степень с показателем ноль даёт значение единица. Возведение в степень с показателем единица даёт значение левого операнда. Возведение значения единица в степень даёт значение единица. Возведение значения ноль в степень даёт значение ноль.
Другие требования к точности элементарных функций, которые применяются только в реализациях, соответствующих приложению Numerics, и только в «строгом» режиме, определенном там (см. G.2), приведены в G.2.4.
Когда Float_Type'Signed_Zeros истинно, знак нулевого результата должен быть следующим:
  • Предписанный нулевой результат, полученный в начале координат одной из нечётных функций (Sin, Arcsin, Sinh, Arcsinh, Tan, Arctan или Arccot как функция от Y при фиксированном и положительном X, Tanh и Arctanh), имеет знак параметра X (Y в случае Arctan или Arccot).
  • Предписанный нулевой результат, полученный одной из нечётных функций вне начала координат или какой-либо другой элементарной функцией, имеет знак, определяемый реализацией.
  • Нулевой результат, который не является предписанным результатом (то есть получен в результате округления или потери точности), имеет правильный математический знак.

Разрешения на реализацию

Негенерические эквивалентные пакеты могут, но не обязательно, быть фактическими экземплярами генерического пакета для соответствующего предопределённого типа.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API