Deleted Added
full compact
k_tanf.c (152647) k_tanf.c (152713)
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 152647 2005-11-21 04:57:12Z bde $";
17static char rcsid[] = "$FreeBSD: head/lib/msun/src/k_tanf.c 152713 2005-11-23 14:27:56Z 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
24static const float
25pio4 = 7.8539812565e-01, /* 0x3f490fda */
26pio4lo= 3.7748947079e-08, /* 0x33222168 */
27/* |tan(x)/x - t(x)| < 2**-29.2 (~[-1.73e-09, 1.724e-09]). */
24static const double
25pio4 = M_PI_4,
26/* |tan(x)/x - t(x)| < 2**-29.1 (~[-1.72e-09, 1.719e-09]). */
28T[] = {
27T[] = {
29 0xaaaaa3.0p-25, /* 0.33333310485 */
30 0x888b06.0p-26, /* 0.13334283238 */
31 0xdc84c8.0p-28, /* 0.053837567568 */
32 0xb9d8f1.0p-29, /* 0.022686453536 */
33 0xcfe632.0p-31, /* 0.0063445800915 */
34 0xeaf97e.0p-31, /* 0.0071708550677 */
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 */
35};
36
37#ifdef INLINE_KERNEL_TANF
38extern inline
39#endif
40float
34};
35
36#ifdef INLINE_KERNEL_TANF
37extern inline
38#endif
39float
41__kernel_tanf(float x, float y, int iy)
40__kernel_tandf(double x, int iy)
42{
41{
43 float z,r,v,w,s;
42 double z,r,v,w,s;
44 int32_t ix,hx;
45
46 GET_FLOAT_WORD(hx,x);
47 ix = hx&0x7fffffff;
48 if(ix>=0x3f2ca140) { /* |x|>=0.67434 */
43 int32_t ix,hx;
44
45 GET_FLOAT_WORD(hx,x);
46 ix = hx&0x7fffffff;
47 if(ix>=0x3f2ca140) { /* |x|>=0.67434 */
49 if(hx<0) {x = -x; y = -y;}
50 z = pio4-x;
51 w = pio4lo-y;
52 x = z+w; y = 0.0;
48 if(hx<0) {x = -x;}
49 x = pio4-x;
53 }
54 z = x*x;
55 w = z*z;
56 /* Break x^5*(T[1]+x^2*T[2]+...) into
57 * x^5*(T[1]+x^4*T[3]+x^8*T[5]) +
58 * x^5*(x^2*(T[2]+x^4*T[4]))
59 */
60 r = T[1]+w*(T[3]+w*T[5]);
61 v = z*(T[2]+w*T[4]);
62 s = z*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;
63 r = y + z*(s*(r+v)+y);
60 r = z*s*(r+v);
64 r += T[0]*s;
65 w = x+r;
66 if(ix>=0x3f2ca140) {
61 r += T[0]*s;
62 w = x+r;
63 if(ix>=0x3f2ca140) {
67 v = (float)iy;
68 return (float)(1-((hx>>30)&2))*(v-(float)2.0*(x-(w*w/(w+v)-r)));
64 v = (double)iy;
65 return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));
69 }
70 if(iy==1) return w;
66 }
67 if(iy==1) return w;
71 else return -1.0/((double)x+r);
68 else return -1.0/w;
72}
69}