Справочное руководство по Ada 95
G.1.2 Комплексные элементарные функции
Статическая семантика
Обобщенный библиотечный пакет Numerics.Generic_Complex_Elementary_Functions имеет следующее объявление:
with Ada.Numerics.Generic_Complex_Types;
generic
with package Complex_Types is
new Ada.Numerics.Generic_Complex_Types (<>);
use Complex_Types;
package Ada.Numerics.Generic_Complex_Elementary_Functions is
pragma Pure(Generic_Complex_Elementary_Functions);
generic
with package Complex_Types is
new Ada.Numerics.Generic_Complex_Types (<>);
use Complex_Types;
package Ada.Numerics.Generic_Complex_Elementary_Functions is
pragma Pure(Generic_Complex_Elementary_Functions);
function Sqrt (X : Complex) return Complex;
function Log (X : Complex) return Complex;
function Exp (X : Complex) return Complex;
function Exp (X : Imaginary) return Complex;
function "**" (Left : Complex; Right : Complex) return Complex;
function "**" (Left : Complex; Right : Real'Base) return Complex;
function "**" (Left : Real'Base; Right : Complex) return Complex;
function Log (X : Complex) return Complex;
function Exp (X : Complex) return Complex;
function Exp (X : Imaginary) return Complex;
function "**" (Left : Complex; Right : Complex) return Complex;
function "**" (Left : Complex; Right : Real'Base) return Complex;
function "**" (Left : Real'Base; Right : Complex) return Complex;
function Sin (X : Complex) return Complex;
function Cos (X : Complex) return Complex;
function Tan (X : Complex) return Complex;
function Cot (X : Complex) return Complex;
function Cos (X : Complex) return Complex;
function Tan (X : Complex) return Complex;
function Cot (X : Complex) return Complex;
function Arcsin (X : Complex) return Complex;
function Arccos (X : Complex) return Complex;
function Arctan (X : Complex) return Complex;
function Arccot (X : Complex) return Complex;
function Arccos (X : Complex) return Complex;
function Arctan (X : Complex) return Complex;
function Arccot (X : Complex) return Complex;
function Sinh (X : Complex) return Complex;
function Cosh (X : Complex) return Complex;
function Tanh (X : Complex) return Complex;
function Coth (X : Complex) return Complex;
function Cosh (X : Complex) return Complex;
function Tanh (X : Complex) return Complex;
function Coth (X : Complex) return Complex;
function Arcsinh (X : Complex) return Complex;
function Arccosh (X : Complex) return Complex;
function Arctanh (X : Complex) return Complex;
function Arccoth (X : Complex) return Complex;
function Arccosh (X : Complex) return Complex;
function Arctanh (X : Complex) return Complex;
function Arccoth (X : Complex) return Complex;
end Ada.Numerics.Generic_Complex_Elementary_Functions;
Библиотечный пакет Numerics.Complex_Elementary_Functions объявлен чистым и определяет те же подпрограммы, что и Numerics.Generic_Complex_Elementary_Functions, за исключением того, что предопределенный тип Float систематически подставляется вместо Real'Base, а типы Complex и Imaginary, экспортированные Numerics.Complex_Types, систематически подставляются вместо Complex и Imaginary по всей программе. Аналогично определены необобщенные эквиваленты Numerics.Generic_Complex_Elementary_Functions для каждого из других предопределенных типов с плавающей точкой, с именами Numerics.Short_Complex_Elementary_Functions, Numerics.Long_Complex_Elementary_Functions и т. д.
Перегрузка функции Exp для чисто мнимого типа обеспечивает пользователю альтернативный способ составления комплексного значения из заданного модуля и аргумента. В дополнение к Compose_From_Polar(Rho, Theta) (см. G.1.1), программист может написать Rho * Exp(i * Theta).
Мнимая (соответственно, действительная) компонента параметра X прямых гиперболических (соответственно, тригонометрических) функций и функции Exp (а также параметр X сам по себе в случае перегрузки функции Exp для чисто мнимого типа) представляет собой угол, измеренный в радианах, как и мнимая (соответственно, действительная) компонента результата функций Log и обратных гиперболических (соответственно, тригонометрических) функций.
Функции имеют свои обычные математические значения. Однако произвол, присущий размещению разрезов ветвей, на которых некоторые комплексные элементарные функции демонстрируют разрывы, устраняется следующими соглашениями:
- Мнимая компонента результата функций Sqrt и Log претерпевает разрыв, когда параметр X пересекает отрицательную действительную ось.
- Результат оператора возведения в степень, когда левый операнд имеет комплексный тип, претерпевает разрыв, когда этот операнд пересекает отрицательную действительную ось.
- Действительная (соответственно, мнимая) компонента результата функций Arcsin и Arccos (соответственно, Arctanh) претерпевает разрыв, когда параметр X пересекает действительную ось слева от -1.0 или справа от 1.0.
- Действительная (соответственно, мнимая) компонента результата функции Arctan (соответственно, Arcsinh) претерпевает разрыв, когда параметр X пересекает мнимую ось ниже -i или выше i.
- Действительная компонента результата функции Arccot претерпевает разрыв, когда параметр X пересекает мнимую ось между -i и i.
- Мнимая компонента функции Arccosh претерпевает разрыв, когда параметр X пересекает действительную ось слева от 1.0.
- Мнимая компонента результата функции Arccoth претерпевает разрыв, когда параметр X пересекает действительную ось между -1.0 и 1.0.
Вычисленные результаты математически многозначных функций делаются однозначными следующими соглашениями, которые предполагают главную ветвь:
- Действительная компонента результата функций Sqrt и Arccosh неотрицательна.
- То же соглашение применяется к мнимой компоненте результата функции Log, что и к результату версии естественного цикла функции Argument из Numerics.Generic_Complex_Types (см. G.1.1).
- Диапазон действительной (соответственно, мнимой) компоненты результата функций Arcsin и Arctan (соответственно, Arcsinh и Arctanh) составляет приблизительно от -PI/2.0 до PI/2.0.
- Действительная (соответственно, мнимая) компонента результата функций Arccos и Arccot (соответственно, Arccoth) находится в диапазоне от 0.0 до приблизительно PI.
- Диапазон мнимой компоненты результата функции Arccosh составляет приблизительно от -PI до PI.
Кроме того, оператор возведения в степень наследует однозначность функции Log.
Динамическая семантика
Исключение Numerics.Argument_Error генерируется оператором возведения в степень, сигнализируя о значении параметра, выходящем за область определения соответствующей математической функции, когда значение левого операнда равно нулю, а действительная компонента показателя степени (или сам показатель, если он имеет тип реального числа) равна нулю.
Исключение Constraint_Error генерируется, сигнализируя о полюсе математической функции (аналогично делению на ноль), в следующих случаях, при условии, что Complex_Types.Real'Machine_Overflows равно True:
- функциями Log, Cot и Coth, когда значение параметра X равно нулю;
- оператором возведения в степень, когда значение левого операнда равно нулю, а действительная компонента показателя степени (или сам показатель, если он имеет тип реального числа) отрицательна;
- функциями Arctan и Arccot, когда значение параметра X равно ± i;
- функциями Arctanh и Arccoth, когда значение параметра X равно ± 1.0.
Constraint_Error также может быть сгенерирован, когда конечный результат переполняется (см. G.2.6); это может произойти для значений параметров, достаточно близких к полюсам, и, в случае некоторых функций, для значений параметров, имеющих компоненты достаточно большой величины. Когда Complex_Types.Real'Machine_Overflows равно False, результат в полюсах не определен.
Требования к реализации
При реализации Numerics.Generic_Complex_Elementary_Functions диапазон промежуточных значений, разрешенных при вычислении окончательного результата, не должен зависеть от каких-либо ограничений диапазона подтипа Complex_Types.Real.
В следующих случаях вычисление комплексной элементарной функции должно давать предписанный результат (или результат с предписанной компонентой), при условии, что предыдущие правила не предусматривают генерации исключения:
- Когда параметр X имеет значение ноль, функции Sqrt, Sin, Arcsin, Tan, Arctan, Sinh, Arcsinh, Tanh и Arctanh дают результат ноль; функции Exp, Cos и Cosh дают результат один; функции Arccos и Arccot дают действительный результат; и функция Arccoth дает мнимый результат.
- Когда параметр X имеет значение один, функция Sqrt дает результат один; функции Log, Arccos и Arccosh дают результат ноль; и функция Arcsin дает действительный результат.
- Когда параметр X имеет значение -1.0, функция Sqrt дает результат
- i (соответственно, -i), если знак мнимой компоненты X положителен (соответственно, отрицателен), если Complex_Types.Real'Signed_Zeros равно True;
- i, если Complex_Types.Real'Signed_Zeros равно False;
- функция Log дает мнимый результат; и функции Arcsin и Arccos дают действительный результат.
- Когда параметр X имеет значение ± i, функция Log дает мнимый результат.
- Возведение в степень с нулевым показателем дает значение один. Возведение в степень с единичным показателем дает значение левого операнда (как комплексного значения). Возведение в степень значения один дает значение один. Возведение в степень значения ноль дает значение ноль.
Другие требования к точности для комплексных элементарных функций, которые применяются только в строгом режиме, приведены в G.2.6.
Знак нулевого результата или нулевой компоненты результата, полученного комплексной элементарной функцией, определяется реализацией, когда Complex_Types.Real'Signed_Zeros равно True.
Разрешения для реализации
Негенерические эквивалентные пакеты могут, но не обязаны, быть фактическими экземплярами генерического пакета с соответствующим предварительно определённым негенерическим эквивалентом Numerics.Generic_Complex_Types; если это так, то последний должен был быть получен путём фактического экземплярирования Numerics.Generic_Complex_Types.
Оператор возведения в степень может быть реализован с использованием функций Exp и Log. Поскольку эта реализация приводит к низкой точности в некоторых частях области, для комплексного возведения в степень не накладывается никаких требований к точности.
Реализация функции Exp комплексного параметра X разрешает выброс исключения Constraint_Error, сигнализирующего о переполнении, когда вещественная компонента X превышает неопределённый порог, приблизительно равный log(Complex_Types.Real'Safe_Last). Это разрешение признаёт непрактичность предотвращения переполнения в предельном случае, когда показательная функция вещественной компоненты X выходит за безопасный диапазон Complex_Types.Real, но обе компоненты конечного результата не делают этого. Аналогично, функции Sin и Cos (соответственно, Sinh и Cosh) разрешено вызывать исключение Constraint_Error, сигнализирующее о переполнении, когда абсолютное значение мнимой (соответственно, вещественной) компоненты параметра X превышает неопределённый порог, приблизительно равный log(Complex_Types.Real'Safe_Last) + log(2.0). Это разрешение признаёт непрактичность предотвращения переполнения в предельном случае, когда гиперболический синус или косинус мнимой (соответственно, вещественной) компоненты X выходит за безопасный диапазон Complex_Types.Real, но обе компоненты конечного результата не делают этого.
Рекомендации по реализации
Реализации, в которых Complex_Types.Real'Signed_Zeros равно True, должны попытаться обеспечить рациональное рассмотрение знаков нулевых результатов и компонент результата. Например, многие комплексные элементарные функции имеют компоненты, которые являются нечётными функциями одной из компонент параметра; в этих случаях компонента результата должна иметь знак компоненты параметра в начале координат. Другие комплексные элементарные функции имеют нулевые компоненты, знак которых противоположен знаку компоненты параметра в начале координат, или всегда положительный или всегда отрицательный.