Spec-Zone.ru › Ada 2012
Справочное руководство по Ada 2012

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