Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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
with Pure, Nonblocking is
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.
Знак нулевого результата или нулевой компоненты результата, полученного комплексной элементарной функцией, определён в реализации, когда 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