www.pudn.com > system.rar > cosh.c
/****************************************************************************/ /* cosh v2.54 */ /* Copyright (c) 1995-2004 Texas Instruments Incorporated */ /****************************************************************************/ #include#include #include /****************************************************************************/ /* COSH() - Hyperbolic Cosine */ /* */ /* Based on the algorithm from "Software Manual for the Elementary */ /* Functions", Cody and Waite, Prentice Hall 1980, chapter 6. */ /* */ /* result = (exp(x) + 1 / exp(x)) / 2 */ /****************************************************************************/ double cosh(double x) { double g, z, q, p, r, a, b; int n; /****************************************************************************/ /* cosh(x) = cosh(-x) */ /****************************************************************************/ x = fabs(x); /****************************************************************************/ /* check to see if overflow would occur */ /****************************************************************************/ if (x > MAXH) { errno = ERANGE; return (HUGE_VAL); } if (x < 0) n = (int) (x * INVLOGe2 - 0.5); /* since (int) -1.5 = -1.0 */ else n = (int) (x * INVLOGe2 + 0.5); /****************************************************************************/ /* g = x - n * ln(2) (but more mathematically stable) */ /****************************************************************************/ g = (x - n * C3) - n * C4; /****************************************************************************/ /* determine polynomial expression */ /****************************************************************************/ z = g * g; #if BITS <=29 p = (EXP1 * z + EXP0) * g; q = EXQ1 * z + EXQ0; #elif BITS>=30 && BITS<=42 p = (EXP1 * z + EXP0) * g; q = (EXQ2 * z + EXQ1) * z + EXQ0; #elif BITS>=43 && BITS<=56 p = ((EXP2 * z + EXP1) * z + EXP0) * g; q = (EXQ2 * z + EXQ1) * z + EXQ0; #else p = ((EXP2 * z + EXP1) * z + EXP0) * g; q = ((EXQ3 * z + EXQ2) * z + EXQ1) * z + EXQ0; #endif /****************************************************************************/ /* calculate exp(g) */ /****************************************************************************/ r = 0.5 + p / (q - p); /****************************************************************************/ /* exp(x)/2 = exp(g) * 2 ^ (n) */ /****************************************************************************/ a = ldexp(r, n); /****************************************************************************/ /* exp(-x)*2 = 1 / (exp(x)/2) */ /****************************************************************************/ b = 1.0 / a; /****************************************************************************/ /* cosh(x) = exp(x)/2 + exp(-x)*2 / 4 */ /****************************************************************************/ return (a + b * 0.25); }