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

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);
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 Sin (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 Sinh (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;
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.
Вычисленные результаты математически многозначных функций сводятся к однозначным значениям с помощью следующих соглашений, которые должны подразумевать, что основная ветвь является аналитическим продолжением соответствующей вещественной функции в Numerics.Generic_Elementary_Functions. (Для Arctan и Arccot рассматриваемая функция с одним аргументом получается из функции с двумя аргументами путем фиксации второго аргумента на его значении по умолчанию.)
  • Вещественная компонента результата функций Sqrt и Arccosh неотрицательна.
  • То же самое соглашение применяется к мнимой компоненте результата функции Log, что и к результату функции Argument естественного цикла из Numerics.Generic_Complex_Types (см. G.1.1).
  • Диапазон вещественной (соответственно, мнимой) компоненты результата функций Arcsin и Arctan (соответственно, Arcsinh и Arctanh) приблизительно от –π/2,0 до π/2,0.
  • Вещественная (соответственно, мнимая) компонента результата функций Arccos и Arccot (соответственно, Arccoth) варьируется от 0,0 до приблизительно π.
  • Диапазон мнимой компоненты результата функции Arccosh приблизительно от –π до π.
Кроме того, оператор возведения в степень наследует однозначность функции 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;
  • Когда параметр X имеет значение –1,0, функция Log даёт мнимый результат; а функции Arcsin и Arccos дают вещественный результат.
  • Когда параметр X имеет значение ± i, функция Log даёт мнимый результат.
  • Возведение в степень с нулевым показателем даёт значение один. Возведение в степень с единичным показателем даёт значение левого операнда (как комплексного значения). Возведение значения один в степень даёт значение один. Возведение значения ноль в степень даёт значение ноль.
Другие требования к точности для комплексных элементарных функций, которые применяются только в строгом режиме, приведены в G.2.6.
END_OF_DOCUMENT_MARKER
Знак нулевого результата или нулевого компонента результата, полученного от сложной элементарной функции, определяется реализацией, когда 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, должны стремиться обеспечить рациональную обработку знаков нулевых результатов и компонентов результата. Например, многие комплексные элементарные функции имеют компоненты, которые являются нечётными функциями от одного из компонентов параметра; в этих случаях компонент результата должен иметь знак компонента параметра в нуле. Другие комплексные элементарные функции имеют нулевые компоненты, чей знак противоположен знаку компонента параметра в нуле, или всегда положительный или всегда отрицательный.


Spec-Zone.ru

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