&ANALYZE-SUSPEND _VERSION-NUMBER UIB_v8r12 &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Method-Library /*-------------------------------------------------------------------------- Library : maths.i Purpose : Trig Functions Syntax : Standard Calling Conventions Description : Contains various mathematical trig 4GL functions. Author(s) : Converted from v6 ------------------------------------------------------------------------*/ /* This .W file was created with the Progress UIB. */ /*----------------------------------------------------------------------*/ /* *************************** Definitions ************************** */ &SCOPED-DEFINE CONSTANT_PI 3.1415926536 &SCOPED-DEFINE CONSTANT_PI2 1.5707963268 &SCOPED-DEFINE CONSTANT_R2D 57.2957795131 &SCOPED-DEFINE CONSTANT_S2 0.7071067812 &SCOPED-DEFINE CONSTANT_E 2.7182818285 /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK /* ******************** Preprocessor Definitions ******************** */ /* _UIB-PREPROCESSOR-BLOCK-END */ &ANALYZE-RESUME /* ************************ Function Prototypes ********************** */ &IF DEFINED(EXCLUDE-ACOS) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACOS Method-Library FUNCTION ACOS RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOSH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACOSH Method-Library FUNCTION ACOSH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOT) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACOT Method-Library FUNCTION ACOT RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOTH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACOTH Method-Library FUNCTION ACOTH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACSC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACSC Method-Library FUNCTION ACSC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACSCH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ACSCH Method-Library FUNCTION ACSCH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASEC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ASEC Method-Library FUNCTION ASEC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASECH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ASECH Method-Library FUNCTION ASECH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASIN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ASIN Method-Library FUNCTION ASIN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASINH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ASINH Method-Library FUNCTION ASINH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ATAN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ATAN Method-Library FUNCTION ATAN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ATANH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD ATANH Method-Library FUNCTION ATANH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COS) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD COS Method-Library FUNCTION COS RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COSH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD COSH Method-Library FUNCTION COSH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COT) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD COT Method-Library FUNCTION COT RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COTH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD COTH Method-Library FUNCTION COTH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-CSC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD CSC Method-Library FUNCTION CSC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-CSCH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD CSCH Method-Library FUNCTION CSCH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-FACTOR) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD FACTOR Method-Library FUNCTION FACTOR RETURNS CHARACTER ( INPUT expression AS INTEGER ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-FACTORIAL) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD FACTORIAL Method-Library FUNCTION FACTORIAL RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-LCM) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD LCM Method-Library FUNCTION LCM RETURNS DECIMAL ( INPUT expression_x AS DECIMAL, INPUT expression_y AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SEC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD SEC Method-Library FUNCTION SEC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SECH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD SECH Method-Library FUNCTION SECH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SIN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD SIN Method-Library FUNCTION SIN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SINH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD SINH Method-Library FUNCTION SINH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-TAN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD TAN Method-Library FUNCTION TAN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-TANH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD TANH Method-Library FUNCTION TANH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF /* *********************** Procedure Settings ************************ */ &ANALYZE-SUSPEND _PROCEDURE-SETTINGS /* Settings for THIS-PROCEDURE Type: Method-Library Allow: Frames: 0 Add Fields to: Neither Other Settings: INCLUDE-ONLY */ &ANALYZE-RESUME _END-PROCEDURE-SETTINGS /* ************************* Create Window ************************** */ &ANALYZE-SUSPEND _CREATE-WINDOW /* DESIGN Window definition (used by the UIB) CREATE WINDOW Method-Library ASSIGN HEIGHT = 1.91 WIDTH = 55.8. /* END WINDOW DEFINITION */ */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _INCLUDED-LIB Method-Library /* ************************* Included-Libraries *********************** */ /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Method-Library /* *************************** Main Block *************************** */ /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME /* ************************ Function Implementations ***************** */ &IF DEFINED(EXCLUDE-ACOS) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACOS Method-Library FUNCTION ACOS RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE COSINE of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. IF expression >=1 OR expression <= -1 THEN RETURN ?. ASSIGN calc_x = (IF expression < - {&CONSTANT_S2} OR expression > {&CONSTANT_S2} THEN SQRT(1 - expression * expression) ELSE expression) calc_x = calc_x + EXP(calc_x, 3) / 6 + EXP(calc_x, 5) / 13.3333333333 + EXP(calc_x, 7) / 22.4000000000 + EXP(calc_x, 9) / 32.9142857143 + EXP(calc_x,11) / 44.6984126984 + EXP(calc_x,13) / 57.6277052677 calc_x = {&CONSTANT_R2D} * (IF expression < - {&CONSTANT_S2} OR expression > {&CONSTANT_S2} THEN {&CONSTANT_PI2} - calc_x ELSE calc_x). RETURN 90 - calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOSH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACOSH Method-Library FUNCTION ACOSH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC COSINE of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG(expression + SQRT(expression * expression - 1)). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOT) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACOT Method-Library FUNCTION ACOT RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE COTANGENT of expression Notes: ------------------------------------------------------------------------------*/ RETURN 90 - ATAN(expression). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACOTH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACOTH Method-Library FUNCTION ACOTH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC COTANGENT of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG((expression + 1) / (expression - 1)) / 2. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACSC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACSC Method-Library FUNCTION ACSC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE COSECANT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = ATAN(1 / SQRT(expression * expression - 1)). RETURN calc_x + (IF expression < 0 THEN -180 ELSE IF expression > 0 THEN 0 ELSE 90). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ACSCH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ACSCH Method-Library FUNCTION ACSCH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC COSECANT of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG(((IF expression < 0 THEN -1 ELSE IF expression > 0 THEN 1 ELSE expression) * SQRT(expression * expression + 1) + 1) / expression). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASEC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ASEC Method-Library FUNCTION ASEC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE SECANT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = ATAN (SQRT(expression * expression - 1)). RETURN calc_x + (IF expression < 0 THEN -180 ELSE IF expression > 0 THEN 0 ELSE 90). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASECH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ASECH Method-Library FUNCTION ASECH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC SECANT of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG((SQRT( - expression * expression + 1) + 1) / expression). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASIN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ASIN Method-Library FUNCTION ASIN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE SINE of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. IF expression >= 1 OR expression <= -1 THEN RETURN ?. ASSIGN calc_x = (IF expression < - {&CONSTANT_S2} OR expression > {&CONSTANT_S2} THEN SQRT(1 - expression * expression) ELSE expression) calc_x = calc_x + EXP(calc_x, 3) / 6 + EXP(calc_x, 5) / 13.3333333333 + EXP(calc_x, 7) / 22.4000000000 + EXP(calc_x, 9) / 32.9142857143 + EXP(calc_x,11) / 44.6984126984 + EXP(calc_x,13) / 57.6277052677 calc_x = {&CONSTANT_R2D} * (IF expression < - {&CONSTANT_S2} OR expression > {&CONSTANT_S2} THEN {&CONSTANT_PI2} - calc_x ELSE calc_x). RETURN calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ASINH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ASINH Method-Library FUNCTION ASINH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC SINE of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG(expression + SQRT(expression * expression + 1)). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ATAN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ATAN Method-Library FUNCTION ATAN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE TANGENT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ RETURN ASIN(expression / SQRT(expression * expression + 1)). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-ATANH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION ATANH Method-Library FUNCTION ATANH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the INVERSE HYPERBOLIC TANGENT of expression Notes: ------------------------------------------------------------------------------*/ RETURN LOG((1 + expression) / (1 - expression)) / 2. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COS) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION COS Method-Library FUNCTION COS RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the COSINE of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. DEFINE VARIABLE calc_y AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = (IF expression < -90 THEN 90 - expression ELSE expression + 90) calc_x = calc_x - TRUNCATE(calc_x / 360,0) * 360 calc_y = calc_x calc_x = calc_x - TRUNCATE(calc_x / 90,0) * 90 calc_x = ( IF calc_y >= 270 THEN calc_x - 90 ELSE IF calc_y >= 180 THEN - calc_x ELSE IF calc_y >= 90 THEN 90 - calc_x ELSE calc_x) * {&CONSTANT_PI} / 180 calc_x = (calc_x - EXP(calc_x,3 ) / 6 + EXP(calc_x,5 ) / 120 - EXP(calc_x,7 ) / 5040 + EXP(calc_x,9 ) / 362880 - EXP(calc_x,11) / 39916800 + EXP(calc_x,13) / 6227020800.0). RETURN (IF expression < -90 THEN - calc_x ELSE calc_x). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COSH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION COSH Method-Library FUNCTION COSH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC COSINE of expression Notes: ------------------------------------------------------------------------------*/ RETURN (EXP({&CONSTANT_E},expression) + EXP({&CONSTANT_E},- expression)) / 2. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COT) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION COT Method-Library FUNCTION COT RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the COTANGENT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = COS(expression) / SIN(expression). RETURN IF calc_x = ? THEN 0 ELSE calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-COTH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION COTH Method-Library FUNCTION COTH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC COTANGENT of expression Notes: ------------------------------------------------------------------------------*/ RETURN EXP({&CONSTANT_E},- expression) / (EXP({&CONSTANT_E},expression) - EXP({&CONSTANT_E},- expression)) * 2 + 1. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-CSC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION CSC Method-Library FUNCTION CSC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the COSECANT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ RETURN 1 / SIN(expression). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-CSCH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION CSCH Method-Library FUNCTION CSCH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC COSECANT of expression Notes: ------------------------------------------------------------------------------*/ RETURN 2 / (EXP({&CONSTANT_E},expression) + EXP({&CONSTANT_E},- expression)). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-FACTOR) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION FACTOR Method-Library FUNCTION FACTOR RETURNS CHARACTER ( INPUT expression AS INTEGER ) : /*------------------------------------------------------------------------------ Purpose: Return a list of the prime factors of a number. Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS INTEGER NO-UNDO. DEFINE VARIABLE list_f AS CHARACTER NO-UNDO. DO calc_x = 2 TO SQRT(expression): DO WHILE expression / calc_x = TRUNCATE(expression / calc_x,0): ASSIGN list_f = list_f + (IF list_f = "" THEN "" ELSE ",") + STRING(calc_x) expression = expression / calc_x. END. END. IF expression > 1 THEN list_f = list_f + (IF list_f = "" THEN "" ELSE ",") + STRING(expression). RETURN list_f. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-FACTORIAL) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION FACTORIAL Method-Library FUNCTION FACTORIAL RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the FACTORIAL of expression Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = (IF expression < 0 THEN ? ELSE expression). IF calc_x <> ? THEN DO WHILE expression > 1: ASSIGN expression = expression - 1 calc_x = calc_x * expression. END. RETURN calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-LCM) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION LCM Method-Library FUNCTION LCM RETURNS DECIMAL ( INPUT expression_x AS DECIMAL, INPUT expression_y AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Find the Least Common Multiple of two numbers. Notes: The LCM is the smallest number that contains as factors the given numbers. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL INITIAL 1 NO-UNDO. DEFINE VARIABLE calc_i AS DECIMAL INITIAL 0 NO-UNDO. DO calc_i = 2 TO MINIMUM(expression_x,expression_y): DO WHILE expression_x / calc_i = TRUNCATE(expression_x / calc_i,0) AND expression_y / calc_i = TRUNCATE(expression_y / calc_i,0): ASSIGN expression_x = expression_x / calc_i expression_y = expression_y / calc_i calc_x = calc_x * calc_i. END. END. RETURN calc_x * expression_x * expression_y. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SEC) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION SEC Method-Library FUNCTION SEC RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the SECANT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ RETURN 1 / COS(expression). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SECH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION SECH Method-Library FUNCTION SECH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC SECANT of expression Notes: ------------------------------------------------------------------------------*/ RETURN 2 / (EXP({&CONSTANT_E},expression) + EXP({&CONSTANT_E},- expression)). END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SIN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION SIN Method-Library FUNCTION SIN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the SINE of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. DEFINE VARIABLE calc_y AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = (IF expression < 0 THEN - expression ELSE expression) calc_x = calc_x - TRUNCATE(calc_x / 360,0) * 360 calc_y = calc_x calc_x = calc_x - TRUNCATE(calc_x / 90,0) * 90 calc_y = calc_x calc_x = calc_x - TRUNCATE(calc_x / 90,0) * 90 calc_x = ( IF calc_y >= 270 THEN calc_x - 90 ELSE IF calc_y >= 180 THEN - calc_x ELSE IF calc_y >= 90 THEN 90 - calc_x ELSE calc_x) * {&CONSTANT_PI} / 180 calc_x = (calc_x - EXP(calc_x,3 ) / 6 + EXP(calc_x,5 ) / 120 - EXP(calc_x,7 ) / 5040 + EXP(calc_x,9 ) / 362880 - EXP(calc_x,11) / 39916800 + EXP(calc_x,13) / 6227020800.0). RETURN IF expression < 0 THEN - calc_x ELSE calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-SINH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION SINH Method-Library FUNCTION SINH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC SINE of expression Notes: ------------------------------------------------------------------------------*/ RETURN (EXP({&CONSTANT_E},expression) - EXP({&CONSTANT_E},- expression)) / 2. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-TAN) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION TAN Method-Library FUNCTION TAN RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the TANGENT of expression Notes: All calculations assume arguments and results in DEGREES. ------------------------------------------------------------------------------*/ DEFINE VARIABLE calc_x AS DECIMAL DECIMALS 10 NO-UNDO. ASSIGN calc_x = SIN(expression) / COS(expression). RETURN IF calc_x = ? THEN 0 ELSE calc_x. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF &IF DEFINED(EXCLUDE-TANH) = 0 &THEN &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION TANH Method-Library FUNCTION TANH RETURNS DECIMAL ( INPUT expression AS DECIMAL ) : /*------------------------------------------------------------------------------ Purpose: Calculate the HYPERBOLIC TANGENT of expression Notes: ------------------------------------------------------------------------------*/ RETURN - EXP({&CONSTANT_E},- expression) / (EXP({&CONSTANT_E},expression) + EXP( {&CONSTANT_E},- expression)) * 2 + 1. END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ENDIF