|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)r_tan.c 5.3 11/3/86
7: */
8:
9: #ifndef tahoe
10: float r_tan(x)
11: float *x;
12: {
13: double tan();
14: return( tan(*x) );
15: }
16:
17: #else tahoe
18:
19: /*
20: SINGLE PRECISION floating point tangent
21:
22: sin/cos is used after argument reduction to [0,pi/4] range.
23: since x is in this range, tan(x) is in [0,1] range and
24: no overflow can occur here.
25: */
26:
27: #include <errno.h>
28:
29: int errno;
30: static double invpi = 1.27323954473516268; /* 4/pi */
31:
32: float
33: r_tan(parg)
34: float *parg;
35: {
36: double arg;
37: fortran float sin(), cos();
38: double modf();
39: float flmax_();
40: double temp, e, x, xsq;
41: int sign;
42: int flag, i;
43:
44: arg = *parg;
45: flag = 0;
46: sign = 1.;
47: if(arg < 0.){ /* tan(-arg) = -tan(arg) */
48: arg = -arg;
49: sign = -1.;
50: }
51: arg = arg*invpi; /*overflow?*/
52: x = modf(arg,&e);
53: i = e;
54: switch(i%4) {
55: case 1: /* 2nd octant: tan(x) = 1/tan(1-x) */
56: x = 1. - x;
57: flag = 1;
58: break;
59:
60: case 2: /* 3rd octant: tan(x) = -1/tan(x) */
61: sign = - sign;
62: flag = 1;
63: break;
64:
65: case 3: /* 4th octant: tan(x) = -tan(1-x) */
66: x = 1. - x;
67: sign = - sign;
68: break;
69:
70: case 0: /* 1st octant */
71: break;
72: }
73: x = x/invpi;
74:
75: temp = sin(x)/cos(x);
76:
77: if(flag == 1) {
78: if(temp == 0.) { /* check for singular "point" */
79: errno = ERANGE;
80: if (sign>0)
81: return(flmax_());
82: return(-flmax_());
83: }
84: temp = 1./temp;
85: }
86: return(sign*temp);
87: }
88:
89: #endif tahoe
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.