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

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

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

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

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

package Ada.Numerics.Generic_Elementary_Functions
with Pure, Nonblocking is
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. Аналогично определены негенерические эквиваленты Numerics.Generic_Elementary_Functions для каждого из других предопределённых типов с плавающей точкой с именами Numerics.Short_Elementary_Functions, Numerics.Long_Elementary_Functions и т. д.
Функции имеют свои обычные математические значения. Когда параметр 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 со значением параметра Cycle, когда значение параметра X — нечётное кратное четверти цикла;
  • функцией Cot со значением параметра Cycle, когда значение параметра 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 со значением параметра Cycle являются точными, когда математический результат равен нулю; для первых двух они также являются точными, когда математический результат равен ±1.0.
  • Возведение в степень с нулевым показателем даёт значение один. Возведение в степень с показателем один даёт значение левого операнда. Возведение значения один в степень даёт значение один. Возведение значения ноль в степень даёт значение ноль.
Другие требования к точности для элементарных функций, которые применяются только в реализациях, соответствующих приложению Numerics, и только в режиме «строго» там (см. G.2), приведены в G.2.4.
END_OF_DOCUMENT_MARKER
Когда Float_Type'Signed_Zeros имеет значение True, знак нулевого результата должен быть следующим:
  • Предписанный нулевой результат, полученный в точке происхождения одной из нечётных функций (Sin, Arcsin, Sinh, Arcsinh, Tan, Arctan или Arccot как функции от Y, когда X фиксировано и положительно, Tanh и Arctanh), имеет знак параметра X (Y в случае Arctan или Arccot).
  • Предписанный нулевой результат, полученный одной из нечётных функций вдали от точки происхождения или какой-либо другой элементарной функцией, имеет знак, определяемый реализацией.
  • Нулевой результат, который не является предписанным результатом (то есть, полученный в результате округления или переполнения), имеет правильный математический знак.

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

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


Spec-Zone.ru

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