1 
2 /* @(#)w_asin.c 5.1 93/09/24 */
3 /*
4  * ====================================================
5  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6  *
7  * Developed at SunPro, a Sun Microsystems, Inc. business.
8  * Permission to use, copy, modify, and distribute this
9  * software is freely granted, provided that this notice
10  * is preserved.
11  * ====================================================
12  *
13  */
14 
15 /*
16 FUNCTION
17         <<asin>>, <<asinf>>---arc sine
18 
19 INDEX
20    asin
21 INDEX
22    asinf
23 
24 ANSI_SYNOPSIS
25         #include <math.h>
26         double asin(double <[x]>);
27         float asinf(float <[x]>);
28 
29 TRAD_SYNOPSIS
30         #include <math.h>
31         double asin(<[x]>)
32         double <[x]>;
33 
34         float asinf(<[x]>)
35         float <[x]>;
36 
37 
38 DESCRIPTION
39 
40 <<asin>> computes the inverse sine (arc sine) of the argument <[x]>.
41 Arguments to <<asin>> must be in the range @minus{}1 to 1.
42 
43 <<asinf>> is identical to <<asin>>, other than taking and
44 returning floats.
45 
46 You can modify error handling for these routines using <<matherr>>.
47 
48 RETURNS
49 @ifinfo
50 <<asin>> returns values in radians, in the range of -pi/2 to pi/2.
51 @end ifinfo
52 @tex
53 <<asin>> returns values in radians, in the range of $-\pi/2$ to $\pi/2$.
54 @end tex
55 
56 If <[x]> is not in the range @minus{}1 to 1, <<asin>> and <<asinf>>
57 return NaN (not a number), set the global variable <<errno>> to
58 <<EDOM>>, and issue a <<DOMAIN error>> message.
59 
60 You can change this error treatment using <<matherr>>.
61 
62 QUICKREF ANSI SVID POSIX RENTRANT
63  asin	 y,y,y,m
64  asinf   n,n,n,m
65 
66 MATHREF
67  asin,  -1<=arg<=1, asin(arg),,,
68  asin,  NAN,  arg,EDOM, DOMAIN
69 
70 MATHREF
71  asinf,  -1<=arg<=1, asin(arg),,,
72  asinf,  NAN,  arg,EDOM, DOMAIN
73 
74 
75 */
76 
77 /*
78  * wrapper asin(x)
79  */
80 
81 
82 #include "fdlibm.h"
83 #include <errno.h>
84 
85 #ifndef _DOUBLE_IS_32BITS
86 
87 #ifdef __STDC__
asin(double x)88 	double asin(double x)		/* wrapper asin */
89 #else
90 	double asin(x)			/* wrapper asin */
91 	double x;
92 #endif
93 {
94 #ifdef _IEEE_LIBM
95 	return __ieee754_asin(x);
96 #else
97 	double z;
98 	struct exception exc;
99 	z = __ieee754_asin(x);
100 	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
101 	if(fabs(x)>1.0) {
102 	    /* asin(|x|>1) */
103 	    exc.type = DOMAIN;
104 	    exc.name = "asin";
105 	    exc.err = 0;
106 	    exc.arg1 = exc.arg2 = x;
107 	    exc.retval = 0.0;
108 	    if(_LIB_VERSION == _POSIX_)
109 	      errno = EDOM;
110 	    else if (!matherr(&exc)) {
111 	      errno = EDOM;
112 	    }
113 	    if (exc.err != 0)
114 	      errno = exc.err;
115 	    return exc.retval;
116 	} else
117 	    return z;
118 #endif
119 }
120 
121 #endif /* defined(_DOUBLE_IS_32BITS) */
122