t2ex/bsd_source/lib/libc/src_bsd/math/s_tan.c | bare source | permlink (0.02 seconds) |
1: /* @(#)s_tan.c 5.1 93/09/24 */ 2: /* 3: * ==================================================== 4: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 5: * 6: * Developed at SunPro, a Sun Microsystems, Inc. business. 7: * Permission to use, copy, modify, and distribute this 8: * software is freely granted, provided that this notice 9: * is preserved. 10: * ==================================================== 11: */ 12: 13: /* tan(x) 14: * Return tangent function of x. 15: * 16: * kernel function: 17: * __kernel_tan ... tangent function on [-pi/4,pi/4] 18: * __ieee754_rem_pio2 ... argument reduction routine 19: * 20: * Method. 21: * Let S,C and T denote the sin, cos and tan respectively on 22: * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 23: * in [-pi/4 , +pi/4], and let n = k mod 4. 24: * We have 25: * 26: * n sin(x) cos(x) tan(x) 27: * ---------------------------------------------------------- 28: * 0 S C T 29: * 1 C -S -1/T 30: * 2 -S -C T 31: * 3 -C S -1/T 32: * ---------------------------------------------------------- 33: * 34: * Special cases: 35: * Let trig be any of sin, cos, or tan. 36: * trig(+-INF) is NaN, with signals; 37: * trig(NaN) is that NaN; 38: * 39: * Accuracy: 40: * TRIG(x) returns trig(x) nearly rounded 41: */ 42: 43: /* LINTLIBRARY */ 44: 45: #include <sys/cdefs.h> 46: #include <float.h> 47: #include <math.h> 48: 49: #include "math_private.h" 50: 51: double 52: tan(double x) 53: { 54: double y[2],z=0.0; 55: int32_t n, ix; 56: 57: /* High word of x. */ 58: GET_HIGH_WORD(ix,x); 59: 60: /* |x| ~< pi/4 */ 61: ix &= 0x7fffffff; 62: if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1); 63: 64: /* tan(Inf or NaN) is NaN */ 65: else if (ix>=0x7ff00000) return x-x; /* NaN */ 66: 67: /* argument reduction needed */ 68: else { 69: n = __ieee754_rem_pio2(x,y); 70: return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even 71: -1 -- n odd */ 72: } 73: } 74: 75: #if LDBL_MANT_DIG == 53 76: #ifdef lint 77: /* PROTOLIB1 */ 78: long double tanl(long double); 79: #else /* lint */ 80: __weak_alias(tanl, tan); 81: #endif /* lint */ 82: #endif /* LDBL_MANT_DIG == 53 */