Deleted Added
full compact
k_tanf.c (152713) k_tanf.c (152741)
1/* k_tanf.c -- float version of k_tan.c
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
8 *
9 * Permission to use, copy, modify, and distribute this
10 * software is freely granted, provided that this notice
11 * is preserved.
12 * ====================================================
13 */
14
15#ifndef INLINE_KERNEL_TANF
16#ifndef lint
1/* k_tanf.c -- float version of k_tan.c
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
8 *
9 * Permission to use, copy, modify, and distribute this
10 * software is freely granted, provided that this notice
11 * is preserved.
12 * ====================================================
13 */
14
15#ifndef INLINE_KERNEL_TANF
16#ifndef lint
17static char rcsid[] = "$FreeBSD: head/lib/msun/src/k_tanf.c 152713 2005-11-23 14:27:56Z bde $";
17static char rcsid[] = "$FreeBSD: head/lib/msun/src/k_tanf.c 152741 2005-11-24 02:04:26Z bde $";
18#endif
19#endif
20
21#include "math.h"
22#include "math_private.h"
23
18#endif
19#endif
20
21#include "math.h"
22#include "math_private.h"
23
24/* |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]). */
24static const double
25static const double
25pio4 = M_PI_4,
26/* |tan(x)/x - t(x)| < 2**-29.1 (~[-1.72e-09, 1.719e-09]). */
27T[] = {
26T[] = {
28 0x1555545f8b54d0.0p-54, /* 0.333333104424423432022 */
29 0x111160cdc2c9af.0p-55, /* 0.133342838734802765499 */
30 0x1b9097e5693cd0.0p-57, /* 0.0538375346701457369036 */
31 0x173b2333895b6f.0p-58, /* 0.0226865291791357691353 */
32 0x19fcb197e825ab.0p-60, /* 0.00634450313965243938713 */
33 0x1d5f3701b44a27.0p-60, /* 0.00717088210082520490646 */
27 0x15554d3418c99f.0p-54, /* 0.333331395030791399758 */
28 0x1112fd38999f72.0p-55, /* 0.133392002712976742718 */
29 0x1b54c91d865afe.0p-57, /* 0.0533812378445670393523 */
30 0x191df3908c33ce.0p-58, /* 0.0245283181166547278873 */
31 0x185dadfcecf44e.0p-61, /* 0.00297435743359967304927 */
32 0x1362b9bf971bcd.0p-59, /* 0.00946564784943673166728 */
34};
35
36#ifdef INLINE_KERNEL_TANF
37extern inline
38#endif
39float
40__kernel_tandf(double x, int iy)
41{
42 double z,r,v,w,s;
43 int32_t ix,hx;
44
45 GET_FLOAT_WORD(hx,x);
46 ix = hx&0x7fffffff;
33};
34
35#ifdef INLINE_KERNEL_TANF
36extern inline
37#endif
38float
39__kernel_tandf(double x, int iy)
40{
41 double z,r,v,w,s;
42 int32_t ix,hx;
43
44 GET_FLOAT_WORD(hx,x);
45 ix = hx&0x7fffffff;
47 if(ix>=0x3f2ca140) { /* |x|>=0.67434 */
48 if(hx<0) {x = -x;}
49 x = pio4-x;
50 }
51 z = x*x;
52 w = z*z;
53 /* Break x^5*(T[1]+x^2*T[2]+...) into
54 * x^5*(T[1]+x^4*T[3]+x^8*T[5]) +
55 * x^5*(x^2*(T[2]+x^4*T[4]))
56 */
57 r = T[1]+w*(T[3]+w*T[5]);
58 v = z*(T[2]+w*T[4]);
59 s = z*x;
60 r = z*s*(r+v);
61 r += T[0]*s;
62 w = x+r;
46 z = x*x;
47 w = z*z;
48 /* Break x^5*(T[1]+x^2*T[2]+...) into
49 * x^5*(T[1]+x^4*T[3]+x^8*T[5]) +
50 * x^5*(x^2*(T[2]+x^4*T[4]))
51 */
52 r = T[1]+w*(T[3]+w*T[5]);
53 v = z*(T[2]+w*T[4]);
54 s = z*x;
55 r = z*s*(r+v);
56 r += T[0]*s;
57 w = x+r;
63 if(ix>=0x3f2ca140) {
64 v = (double)iy;
65 return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));
66 }
67 if(iy==1) return w;
68 else return -1.0/w;
69}
58 if(iy==1) return w;
59 else return -1.0/w;
60}