/*------------------------------------------------------------------------ * filename - coshl.cas * * function(s) * coshl - long double hyperbolic cosine function *-----------------------------------------------------------------------*/ /* * C/C++ Run Time Library - Version 6.5 * * Copyright (c) 1987, 1994 by Borland International * All Rights Reserved. * */ #pragma inline #include #include <_math.h> #include #include #include /*--------------------------------------------------------------------------* Name coshl - long double hyperbolic function Usage long double coshl(long double x); Prototype in math.h Description coshl computes the hyperbolic cosine of the input value. Return value coshl returns the hyperbolic cosine of the input value. For large arguments (absolute value greater than ~11356.5) the result will be _LHUGE_VAL of the appropriate sign and errno will be set to: ERANGE Range error. e *---------------------------------------------------------------------------*/ long double _FARFUNC coshl (long double x) { asm FLD1 asm mov ax, 7FFFh asm FCHS /* TOS = -1.0, used in FSCALE later */ asm and ax, x [8] /* select exponent */ asm FLD LONGDOUBLE (x) asm cmp ax, 3fffh+13 asm jae coshl_tooBig /* exp (+-2^13) considered too large */ asm cmp ax, 3fffh-13 asm jb coshl_tiny coshl_justFits: __expld(); /* TOS = expl(x) */ asm FLD1 asm FDIV st, st(1) /* TOS = expl (-x) = 1 / expl(x) */ asm FADDP st(1), st /* TOS = expl(x) + expl(-x) */ asm FSCALE /* coshl (x) = (expl(x) + expl(-x)) / 2 */ asm FSTP st(1) coshl_end: #pragma noretval return; coshl_tooBig: asm mov ax, 0FFFFh /* force extreme */ asm ja coshl_excess asm mov ax, x [6] coshl_excess: asm test BY0 (x [9]), 80h asm jnz coshl_tooTiny asm cmp ax, 0B172h asm jb coshl_justFits asm mov si, OVERFLOW asm jmp short coshl_err coshl_tooTiny: asm cmp ax, 0B16Ch asm jb coshl_justFits asm mov si, UNDERFLOW coshl_err: asm FSTP ST(0) /* pop two items off the stack */ asm FSTP ST(0) #pragma warn -ret return __matherrl (_SI, "coshl", &x, NULL, (UNDERFLOW == _SI) ? 0.0 : _LHUGE_VAL); #pragma warn .ret /* coshl is more accurately calculated by the polynomial (1 + x^2/2) when x is tiny (|x| < 2^-13). */ coshl_tiny: asm FMUL ST(0), ST(0) asm FSCALE /* divide by 2 */ asm FSUBRP ST(1), ST(0) /* +1 == - (-1) */ asm jmp short coshl_end #pragma warn -rvl } #pragma warn .rvl