-- CXG1005.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained -- unlimited rights in the software and documentation contained herein. -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making -- this public release, the Government intends to confer upon all -- recipients unlimited rights equal to those held by the Government. -- These rights include rights to use, duplicate, release or disclose the -- released technical data and computer software in whole or in part, in -- any manner and for any purpose whatsoever, and to have or permit others -- to do so. -- -- DISCLAIMER -- -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A -- PARTICULAR PURPOSE OF SAID MATERIAL. --* -- -- OBJECTIVE: -- Check that the subprograms defined in the package -- Ada.Numerics.Generic_Complex_Elementary_Functions provide correct -- results. -- -- TEST DESCRIPTION: -- This test checks that specific subprograms defined in the generic -- package Generic_Complex_Elementary_Functions are available, and that -- they provide prescribed results given specific input values. -- The generic package Ada.Numerics.Generic_Complex_Types is instantiated -- with a real type (new Float). The resulting new package is used as -- the generic actual to package Complex_IO. -- -- SPECIAL REQUIREMENTS: -- Implementations for which Float'Signed_Zeros is True must provide -- a body for ImpDef.Annex_G.Negative_Zero which returns a negative -- zero. -- -- APPLICABILITY CRITERIA -- This test only applies to implementations that support the -- numerics annex. -- -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- 16 Nov 95 SAIC Corrected visibility problems for ACVC 2.0.1. -- 21 Feb 96 SAIC Incorporated new structure for package Impdef. -- 29 Sep 96 SAIC Incorporated reviewer comments. -- --! with Ada.Numerics.Generic_Complex_Types; with Ada.Numerics.Generic_Complex_Elementary_Functions; with ImpDef.Annex_G; with Report; procedure CXG1005 is begin Report.Test ("CXG1005", "Check that the subprograms defined in " & "the package Generic_Complex_Elementary_" & "Functions provide correct results"); Test_Block: declare type Real_Type is new Float; TC_Signed_Zeros : Boolean := Real_Type'Signed_Zeros; package Complex_Pack is new Ada.Numerics.Generic_Complex_Types(Real_Type); package CEF is new Ada.Numerics.Generic_Complex_Elementary_Functions(Complex_Pack); use Ada.Numerics, Complex_Pack, CEF; Complex_Zero : constant Complex := Compose_From_Cartesian( 0.0, 0.0); Plus_One : constant Complex := Compose_From_Cartesian( 1.0, 0.0); Minus_One : constant Complex := Compose_From_Cartesian(-1.0, 0.0); Plus_i : constant Complex := Compose_From_Cartesian(i); Minus_i : constant Complex := Compose_From_Cartesian(-i); Complex_Positive_Real : constant Complex := Compose_From_Cartesian(4.0, 2.0); Complex_Positive_Imaginary : constant Complex := Compose_From_Cartesian(3.0, 5.0); Complex_Negative_Real : constant Complex := Compose_From_Cartesian(-4.0, 2.0); Complex_Negative_Imaginary : constant Complex := Compose_From_Cartesian(3.0, -5.0); function A_Zero_Result (Z : Complex) return Boolean is begin return (Re(Z) = 0.0 and Im(Z) = 0.0); end A_Zero_Result; -- In order to evaluate complex elementary functions that are -- prescribed to return a "real" result (meaning that the imaginary -- component is zero), the Function A_Real_Result is defined. function A_Real_Result (Z : Complex) return Boolean is begin return Im(Z) = 0.0; end A_Real_Result; -- In order to evaluate complex elementary functions that are -- prescribed to return an "imaginary" result (meaning that the real -- component of the complex number is zero, and the imaginary -- component is non-zero), the Function An_Imaginary_Result is defined. function An_Imaginary_Result (Z : Complex) return Boolean is begin return (Re(Z) = 0.0 and Im(Z) /= 0.0); end An_Imaginary_Result; begin -- Check that when the input parameter value is zero, the following -- functions yield a zero result. if not A_Zero_Result( Sqrt(Complex_Zero) ) then Report.Failed("Non-zero result from Function Sqrt with zero input"); end if; if not A_Zero_Result( Sin(Complex_Zero) ) then Report.Failed("Non-zero result from Function Sin with zero input"); end if; if not A_Zero_Result( Arcsin(Complex_Zero) ) then Report.Failed("Non-zero result from Function Arcsin with zero " & "input"); end if; if not A_Zero_Result( Tan(Complex_Zero) ) then Report.Failed("Non-zero result from Function Tan with zero input"); end if; if not A_Zero_Result( Arctan(Complex_Zero) ) then Report.Failed("Non-zero result from Function Arctan with zero " & "input"); end if; if not A_Zero_Result( Sinh(Complex_Zero) ) then Report.Failed("Non-zero result from Function Sinh with zero input"); end if; if not A_Zero_Result( Arcsinh(Complex_Zero) ) then Report.Failed("Non-zero result from Function Arcsinh with zero " & "input"); end if; if not A_Zero_Result( Tanh(Complex_Zero) ) then Report.Failed("Non-zero result from Function Tanh with zero input"); end if; if not A_Zero_Result( Arctanh(Complex_Zero) ) then Report.Failed("Non-zero result from Function Arctanh with zero " & "input"); end if; -- Check that when the input parameter value is zero, the following -- functions yield a result of one. if Exp(Complex_Zero) /= Plus_One then Report.Failed("Non-zero result from Function Exp with zero input"); end if; if Cos(Complex_Zero) /= Plus_One then Report.Failed("Non-zero result from Function Cos with zero input"); end if; if Cosh(Complex_Zero) /= Plus_One then Report.Failed("Non-zero result from Function Cosh with zero input"); end if; -- Check that when the input parameter value is zero, the following -- functions yield a real result. if not A_Real_Result( Arccos(Complex_Zero) ) then Report.Failed("Non-real result from Function Arccos with zero input"); end if; if not A_Real_Result( Arccot(Complex_Zero) ) then Report.Failed("Non-real result from Function Arccot with zero input"); end if; -- Check that when the input parameter value is zero, the following -- functions yield an imaginary result. if not An_Imaginary_Result( Arccoth(Complex_Zero) ) then Report.Failed("Non-imaginary result from Function Arccoth with " & "zero input"); end if; -- Check that when the input parameter value is one, the Sqrt function -- yields a result of one. if Sqrt(Plus_One) /= Plus_One then Report.Failed("Incorrect result from Function Sqrt with input " & "value of one"); end if; -- Check that when the input parameter value is one, the following -- functions yield a result of zero. if not A_Zero_Result( Log(Plus_One) ) then Report.Failed("Non-zero result from Function Log with input " & "value of one"); end if; if not A_Zero_Result( Arccos(Plus_One) ) then Report.Failed("Non-zero result from Function Arccos with input " & "value of one"); end if; if not A_Zero_Result( Arccosh(Plus_One) ) then Report.Failed("Non-zero result from Function Arccosh with input " & "value of one"); end if; -- Check that when the input parameter value is one, the Arcsin -- function yields a real result. if not A_Real_Result( Arcsin(Plus_One) ) then Report.Failed("Non-real result from Function Arcsin with input " & "value of one"); end if; -- Check that when the input parameter value is minus one, the Sqrt -- function yields a result of "i", when the sign of the imaginary -- component of the input parameter is positive (and yields "-i", if -- the sign on the imaginary component is negative), and the -- Complex_Types.Real'Signed_Zeros attribute is True. if TC_Signed_Zeros then declare Minus_One_With_Pos_Zero_Im_Component : Complex := Compose_From_Cartesian(-1.0, +0.0); Minus_One_With_Neg_Zero_Im_Component : Complex := Compose_From_Cartesian (-1.0, Real_Type(ImpDef.Annex_G.Negative_Zero)); begin if Sqrt(Minus_One_With_Pos_Zero_Im_Component) /= Plus_i then Report.Failed("Incorrect result from Function Sqrt, when " & "input value is minus one with a positive " & "imaginary component, Signed_Zeros being True"); end if; if Sqrt(Minus_One_With_Neg_Zero_Im_Component) /= Minus_i then Report.Failed("Incorrect result from Function Sqrt, when " & "input value is minus one with a negative " & "imaginary component, Signed_Zeros being True"); end if; end; else -- Signed_Zeros is False. -- Check that when the input parameter value is minus one, the Sqrt -- function yields a result of "i", when the -- Complex_Types.Real'Signed_Zeros attribute is False. if Sqrt(Minus_One) /= Plus_i then Report.Failed("Incorrect result from Function Sqrt, when " & "input value is minus one, Signed_Zeros being " & "False"); end if; end if; -- Check that when the input parameter value is minus one, the Log -- function yields an imaginary result. if not An_Imaginary_Result( Log(Minus_One) ) then Report.Failed("Non-imaginary result from Function Log with a " & "minus one input value"); end if; -- Check that when the input parameter is minus one, the following -- functions yield a real result. if not A_Real_Result( Arcsin(Minus_One) ) then Report.Failed("Non-real result from Function Arcsin with a " & "minus one input value"); end if; if not A_Real_Result( Arccos(Minus_One) ) then Report.Failed("Non-real result from Function Arccos with a " & "minus one input value"); end if; -- Check that when the input parameter has a value of +i or -i, the -- Log function yields an imaginary result. if not An_Imaginary_Result( Log(Plus_i) ) then Report.Failed("Non-imaginary result from Function Log with an " & "input value of ""+i"""); end if; if not An_Imaginary_Result( Log(Minus_i) ) then Report.Failed("Non-imaginary result from Function Log with an " & "input value of ""-i"""); end if; -- Check that exponentiation by a zero exponent yields the value one. if "**"(Left => Compose_From_Cartesian(5.0, 3.0), Right => Complex_Zero) /= Plus_One or Complex_Negative_Real**0.0 /= Plus_One or 15.0**Complex_Zero /= Plus_One then Report.Failed("Incorrect result from exponentiation with a zero " & "exponent"); end if; -- Check that exponentiation by a unit exponent yields the value of -- the left operand (as a complex value). -- Note: a "unit exponent" is considered the complex number (1.0, 0.0) if "**"(Complex_Negative_Real, Plus_One) /= Complex_Negative_Real or Complex_Negative_Imaginary**Plus_One /= Complex_Negative_Imaginary or 4.0**Plus_One /= Compose_From_Cartesian(4.0, 0.0) then Report.Failed("Incorrect result from exponentiation with a unit " & "exponent"); end if; -- Check that exponentiation of the value one yields the value one. if "**"(Plus_One, Complex_Negative_Imaginary) /= Plus_One or Plus_One**9.0 /= Plus_One or 1.0**Complex_Negative_Real /= Plus_One then Report.Failed("Incorrect result from exponentiation of the value " & "One"); end if; -- Check that exponentiation of the value zero yields the value zero. begin if not A_Zero_Result("**"(Complex_Zero, Complex_Positive_Imaginary)) or not A_Zero_Result(Complex_Zero**4.0) or not A_Zero_Result(0.0**Complex_Positive_Real) then Report.Failed("Incorrect result from exponentiation of the " & "value zero"); end if; exception when others => Report.Failed("Exception raised during the exponentiation of " & "the complex value zero"); end; exception when others => Report.Failed ("Exception raised in Test_Block"); end Test_Block; Report.Result; end CXG1005;