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 }
|