54 * Special cases: 55 * Let trig be any of sin, cos, or tan. 56 * trig(+-INF) is NaN, with signals; 57 * trig(NaN) is that NaN; 58 * 59 * Accuracy: 60 * computer TRIG(x) returns trig(x) nearly rounded. 61 */ 62 /* INDENT ON */ 63 64 #include "libm.h" 65 #include "libm_synonyms.h" 66 #include "longdouble.h" 67 68 #include <sys/isa_defs.h> 69 70 long double 71 tanl(long double x) { 72 long double y[2], z = 0.0L; 73 int n, ix; 74 #if defined(_LITTLE_ENDIAN) 75 int *px = (int *) &x; 76 #endif 77 78 /* trig(Inf or NaN) is NaN */ 79 if (!finitel(x)) 80 return x - x; 81 82 /* High word of x. */ 83 #if defined(_BIG_ENDIAN) 84 ix = *(int *) &x; 85 #else 86 XTOI(px, ix); 87 #endif 88 89 /* |x| ~< pi/4 */ 90 ix &= 0x7fffffff; 91 if (ix <= 0x3ffe9220) 92 return __k_tanl(x, z, 0); 93 94 /* argument reduction needed */ 95 else { 96 n = __rem_pio2l(x, y); 97 return __k_tanl(y[0], y[1], n & 1); 98 } 99 } | 54 * Special cases: 55 * Let trig be any of sin, cos, or tan. 56 * trig(+-INF) is NaN, with signals; 57 * trig(NaN) is that NaN; 58 * 59 * Accuracy: 60 * computer TRIG(x) returns trig(x) nearly rounded. 61 */ 62 /* INDENT ON */ 63 64 #include "libm.h" 65 #include "libm_synonyms.h" 66 #include "longdouble.h" 67 68 #include <sys/isa_defs.h> 69 70 long double 71 tanl(long double x) { 72 long double y[2], z = 0.0L; 73 int n, ix; 74 #if defined(__i386) || defined(__amd64) 75 int *px = (int *) &x; 76 #endif 77 78 /* trig(Inf or NaN) is NaN */ 79 if (!finitel(x)) 80 return x - x; 81 82 /* High word of x. */ 83 #if defined(__i386) || defined(__amd64) 84 XTOI(px, ix); 85 #else 86 ix = *(int *) &x; 87 #endif 88 89 /* |x| ~< pi/4 */ 90 ix &= 0x7fffffff; 91 if (ix <= 0x3ffe9220) 92 return __k_tanl(x, z, 0); 93 94 /* argument reduction needed */ 95 else { 96 n = __rem_pio2l(x, y); 97 return __k_tanl(y[0], y[1], n & 1); 98 } 99 } |