1 /* From: @(#)k_tan.c 1.5 04/04/22 SMI */
4 * ====================================================
5 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
6 * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
8 * Permission to use, copy, modify, and distribute this
9 * software is freely granted, provided that this notice
11 * ====================================================
14 #include <sys/cdefs.h>
15 __FBSDID("$FreeBSD$");
18 * ld128 version of k_tan.c. See ../src/k_tan.c for most comments.
22 #include "math_private.h"
25 * Domain [-0.67434, 0.67434], range ~[-3.37e-36, 1.982e-37]
26 * |tan(x)/x - t(x)| < 2**-117.8 (XXX should be ~1e-37)
28 * See ../ld80/k_cosl.c for more details about the polynomial.
30 static const long double
31 T3
= 0x1.5555555555555555555555555553p
-2L,
32 T5
= 0x1.1111111111111111111111111eb5p
-3L,
33 T7
= 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p
-5L,
34 T9
= 0x1.664f4882c10f9f32d6bbe09d8bcdp
-6L,
35 T11
= 0x1.226e355e6c23c8f5b4f5762322eep
-7L,
36 T13
= 0x1.d6d3d0e157ddfb5fed8e84e27b37p
-9L,
37 T15
= 0x1.7da36452b75e2b5fce9ee7c2c92ep
-10L,
38 T17
= 0x1.355824803674477dfcf726649efep
-11L,
39 T19
= 0x1.f57d7734d1656e0aceb716f614c2p
-13L,
40 T21
= 0x1.967e18afcb180ed942dfdc518d6cp
-14L,
41 T23
= 0x1.497d8eea21e95bc7e2aa79b9f2cdp
-15L,
42 T25
= 0x1.0b132d39f055c81be49eff7afd50p
-16L,
43 T27
= 0x1.b0f72d33eff7bfa2fbc1059d90b6p
-18L,
44 T29
= 0x1.5ef2daf21d1113df38d0fbc00267p
-19L,
45 T31
= 0x1.1c77d6eac0234988cdaa04c96626p
-20L,
46 T33
= 0x1.cd2a5a292b180e0bdd701057dfe3p
-22L,
47 T35
= 0x1.75c7357d0298c01a31d0a6f7d518p
-23L,
48 T37
= 0x1.2f3190f4718a9a520f98f50081fcp
-24L,
49 pio4
= 0x1.921fb54442d18469898cc51701b8p
-1L,
50 pio4lo
= 0x1.cd129024e088a67cc74020bbea60p
-116L;
53 T39
= 0.000000028443389121318352, /* 0x1e8a7592977938.0p-78 */
54 T41
= 0.000000011981013102001973, /* 0x19baa1b1223219.0p-79 */
55 T43
= 0.0000000038303578044958070, /* 0x107385dfb24529.0p-80 */
56 T45
= 0.0000000034664378216909893, /* 0x1dc6c702a05262.0p-81 */
57 T47
= -0.0000000015090641701997785, /* -0x19ecef3569ebb6.0p-82 */
58 T49
= 0.0000000029449552300483952, /* 0x194c0668da786a.0p-81 */
59 T51
= -0.0000000022006995706097711, /* -0x12e763b8845268.0p-81 */
60 T53
= 0.0000000015468200913196612, /* 0x1a92fc98c29554.0p-82 */
61 T55
= -0.00000000061311613386849674, /* -0x151106cbc779a9.0p-83 */
62 T57
= 1.4912469681508012e-10; /* 0x147edbdba6f43a.0p-85 */
65 __kernel_tanl(long double x
, long double y
, int iy
) {
66 long double z
, r
, v
, w
, s
;
70 iy
= (iy
== 1 ? -1 : 1); /* XXX recover original interface */
71 osign
= (x
>= 0 ? 1.0 : -1.0); /* XXX slow, probably wrong for -0 */
72 if (fabsl(x
) >= 0.67434) {
86 r
= T5
+ w
* (T9
+ w
* (T13
+ w
* (T17
+ w
* (T21
+
87 w
* (T25
+ w
* (T29
+ w
* (T33
+
88 w
* (T37
+ w
* (T41
+ w
* (T45
+ w
* (T49
+ w
* (T53
+
90 v
= z
* (T7
+ w
* (T11
+ w
* (T15
+ w
* (T19
+ w
* (T23
+
91 w
* (T27
+ w
* (T31
+ w
* (T35
+
92 w
* (T39
+ w
* (T43
+ w
* (T47
+ w
* (T51
+ w
* T55
))))))))))));
94 r
= y
+ z
* (s
* (r
+ v
) + y
);
100 (v
- 2.0 * (x
- (w
* w
/ (w
+ v
) - r
)));
106 * if allow error up to 2 ulp, simply return
109 /* compute -1.0 / (x+r) accurately */
112 z
= z
+ 0x1p
32 - 0x1p
32;
113 v
= r
- (z
- x
); /* z+v = r+x */
114 t
= a
= -1.0 / w
; /* a = -1.0/w */
115 t
= t
+ 0x1p
32 - 0x1p
32;
117 return t
+ a
* (s
+ t
* v
);