11. Anlage
 
zurück
11.7.1.2 Generic_Complex_Elementary_Functions


Dieses Paket enthält elementare Funktionen, die als Eingabe- und Rückgabewert komplexe Zahlen akzeptieren, wie die Quadratwurzel- oder die Sinusfunktion.

Das generische Kindpaket "Ada.Numerics.Generic_Complex_Elementary_Functions" wird wie folgt deklariert:

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;

Diese Paket akzeptiert als generischen Parameter eine Instantiierung des generischen Pakets "Complex_Types".
Beispiel:

type real_type is new float;
package complex_types is new ada.numerics.generic_complex_types( real_type );
package complex_functions is new ada.numerics.generic_complex_elementary_functions( complex_types );


Neben diesem generischen Paket können zusätzlich analoge, nicht generische Bibliothekspakete mit elementaren Funktionen zu komplexen Zahlen zu vordefinierten Zahlentypen, wie "Float", "Short_Float" oder "Long_Float", angeboten werden, die an Stelle des Basistyps "Real’Base" im generischen Paket mit den jeweiligen vordefinierten Typen operieren.


Die e-hoch-x-Funktion, Exp, gibt es in zwei Ausprägungen, einmal mit einem Parameter vom Typ "Complex" und mit dem Typ "Imaginary". Die Überladung wurde gewählt, um eine übliche Form mathematischer Notation nachbilden zu können. In Analogie zu den Polarkoordinaten ist die Schreibweise "Rho * Exp( i * Theta ) üblich. Diese mathematische Schreibweise braucht nicht durch die Funktion "Compose_From_Polar" unter Angabe von Rho und Theta ersetzt zu werden. Sondern für einen rein imaginären Wert kann direkt diese Ausprägung der "Exp"-Funktionen verwendet werden.
Die reellen oder imaginären Anteile von Ergebnissen folgender Funktionen sind in Übereinstimmung mit den mathematisch exakten Funktionen diskontinuierlich, falls bestimmte Grenzlinien überschritten werden. D. h., wird ein Pfad definiert, der diese Grenzlinie schneidet und der Wert dieser Funktionen längs dieses Pfades bestimmt, so unterscheidet sich das Ergebnis zu drei aufeinanderfolgenden Punkten des Pfades sprunghaft, wenn der erste Punkt auf der einen Seite, der zweite Punkt auf der Grenzlinie und der dritte auf der anderen Seite der Grenzlinie liegen.

Für folgende Funktionen gibt es Grenzlinien dieser Art:

- Der imaginäre Anteil von "Sqrt" und "Log" haben als Grenzlinie die negative reelle Halbachse.
- "**", der Exponentialoperator, hat als Grenzlinie die negative reelle Halbachse für den linken Parameter.
- Der reelle (bzw. der imaginäre) Anteil von "Arcsin" und "Arccos" (bzw. "Arctanh") haben als Grenzlinien die reelle Achse links von -1.0 und   rechts von +1.0, beim Überqueren der Strecke zwischen -1.0 und +1.0 tritt kein Sprung auf.
- Der reelle (bzw. der imaginäre) Anteil von "Arctan" (bzw. "Arcsinh") haben als Grenzlinie die imaginäre Achse unterhalb -i und oberhalb +i.
- Der reelle Anteil von "Arccot" hat als Grenzlinie die Strecke auf der imaginären Achse zwischen -i und +i.
- Der imaginäre Anteil von "Arccosh" hat als Grenzlinie die reelle Achse links von 1.0.
- Der imaginäre Anteil von "Arccoth" hat als Grenzlinie die Strecke zwischen -1.0 und +1.0.

Das Kindpaket "Generic_Complex_Elementary_Functions" definiert keine Ausnahmen. Es wird die Ausnahme "Argument_Error" aus dem Vaterpaket "Ada.Numerics" verwendet, wenn für den Exponentialoperator "**" der linke Parameter null und der reelle Teil des linken Parameters (bzw. der Exponent, falls er reell ist) ebenfalls null ist.
Die Standardausnahme "Constraint_Error" wird für die Werte ausgelöst, in deren Nähe die korrespondierende mathematische Funktion eine Singularität hat, d. h. das Attribut "Complex_Types.Real’Machine_Overflow" einen Überlauf signalisiert (der Typ "Real" ist der generische Parameter des Pakets "Complex_Types"). Das gilt für folgende Funktionen:
  • "Log", "Cot" und "Coth", in der Nähe von Null.
  • Exponentialoperator "**", falls der linke Parameter nahe null und der reelle Teil des rechten Parameters (bzw. der Exponent insgesamt, falls er reell ist) negativ ist.
  • "Arctan" und "Arccot", in der Nähe von +i oder -i.
  • "Arctanh" und "Arccoth", in der Nähe +1.0 oder -1.0.
Die Aussage "in der Nähe von null oder einer anderen Zahl" kann hier nicht präzisiert werden, da eine solche Angabe von der Hardware bzw. von der Übersetzerimplementierung abhängt.

Das Ada-Programm "XXX.ada" im Verzeichnis \Beispele\bestimmt für ein Polynom vom Grade 2 mit reellen Koeffizienten die Nullstellen. Als Lösungsalgorithmus wird die Vieta’sche Regel verwendet. Die Ausgabe sind zwei komplexe Zahlen, die, als Wert für die Unbekannte des Polynoms eingesetzt, null liefern. ???


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.