Справочник по Ada 95
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_Type'Base систематически подставляется предопределенный тип Float. Аналогично определяются негенерические эквиваленты 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 приблизительно равен от -PI/2.0 до PI/2.0 (-Cycle/4.0 до Cycle/4.0, если указан параметр Cycle).
- Результат функции Arccos находится в квадранте, содержащем точку (x, 1.0), где x - значение параметра X. Этот квадрант I или II; таким образом, диапазон функции Arccos находится от 0.0 до примерно PI (Cycle/2.0, если указан параметр Cycle).
- Результаты функций Arctan и Arccot находятся в квадранте, содержащем точку (x, y), где x и y - значения параметров X и Y соответственно. Это может быть любой квадрант (от I до IV), когда указан параметр X (соответственно, Y) функций Arctan (соответственно, Arccot), но он ограничен квадрантами I и IV (соответственно, I и II), когда этот параметр опущен. Таким образом, диапазон, когда этот параметр указан, составляет приблизительно от -PI до PI (-Cycle/2.0 до Cycle/2.0, если параметр Cycle указан); когда он опущен, диапазон Arctan (соответственно, Arccot) такой же, как у Arcsin (соответственно, Arccos), как указано выше. Когда точка (x, y) лежит на отрицательной оси x, результат приблизительно равен
- PI (соответственно, -PI), если знак параметра Y положителен (соответственно, отрицателен), если Float_Type'Signed_Zeros равен True;
- PI, если 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).
- Предписанный нулевой результат, полученный одной из нечётных функций вне начала координат, или какой-либо другой элементарной функцией, имеет определённый реализацией знак.
- Нулевой результат, который не является предписанным результатом (то есть полученный в результате округления или потери точности), имеет правильный математический знак.
Разрешения на реализацию
Негенерические эквивалентные пакеты могут, но не обязательно, быть фактическими экземплярами генерического пакета для соответствующего предопределенного типа.