Справочник Ada 2005
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);
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 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 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 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;
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); при опущении он соответствует области 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.
- Возведение в степень с нулевым показателем дает значение один. Возведение в степень с единичным показателем дает значение левого операнда. Возведение в степень значения один дает значение один. Возведение в степень значения ноль дает значение ноль.
Другие требования к точности для элементарных функций, которые применяются только в реализациях, соответствующих приложению «Числа», и только в режиме «строго» (см. G.2), указаны в G.2.4.
Когда Float_Type'Signed_Zeros истинно, знак нулевого результата должен быть следующим:
- Предписанный нулевой результат, полученный в начале координат одной из нечётных функций (Sin, Arcsin, Sinh, Arcsinh, Tan, Arctan или Arccot как функция от Y при фиксированном и положительном X, Tanh и Arctanh) имеет знак параметра X (Y в случае Arctan или Arccot).
- Предписанный нулевой результат, полученный одной из нечётных функций вне начала координат или какой-либо другой элементарной функцией, имеет знак, определяемый реализацией.
- Нулевой результат, который не является предписанным результатом (то есть результат, полученный в результате округления или потери точности), имеет правильный математический знак.
Разрешения на реализацию
Негенерические эквивалентные пакеты могут, но не обязательно, быть фактическими инстанциациями генерического пакета для соответствующего предопределённого типа.