BSD 4_3_Reno release
[unix-history] / usr / src / lib / libm / common / atan2.c
index 5fc041b..1ab665e 100644 (file)
@@ -1,20 +1,30 @@
-/* 
+/*
  * Copyright (c) 1985 Regents of the University of California.
  * Copyright (c) 1985 Regents of the University of California.
- * 
- * Use and reproduction of this software are granted  in  accordance  with
- * the terms and conditions specified in  the  Berkeley  Software  License
- * Agreement (in particular, this entails acknowledgement of the programs'
- * source, and inclusion of this notice) with the additional understanding
- * that  all  recipients  should regard themselves as participants  in  an
- * ongoing  research  project and hence should  feel  obligated  to report
- * their  experiences (good or bad) with these elementary function  codes,
- * using "sendbug 4bsd-bugs@BERKELEY", to the authors.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * All recipients should regard themselves as participants in an ongoing
+ * research project and hence should feel obligated to report their
+ * experiences (good or bad) with these elementary function codes, using
+ * the sendbug(8) program, to the authors.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] =
-"@(#)atan2.c   1.3 (Berkeley) 8/21/85; 1.4 (ucb.elefunt) %G%";
-#endif not lint
+static char sccsid[] = "@(#)atan2.c    5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 /* ATAN2(Y,X)
  * RETURN ARG (X+iY)
 
 /* ATAN2(Y,X)
  * RETURN ARG (X+iY)
@@ -90,101 +100,80 @@ static char sccsid[] =
  * shown.
  */
 
  * shown.
  */
 
-#if (defined(VAX)||defined(TAHOE))     /* VAX D format */
-#ifdef VAX
-#define _0x(A,B)       0x/**/A/**/B
-#else  /* VAX */
-#define _0x(A,B)       0x/**/B/**/A
-#endif /* VAX */
-/*static double */
-/*athfhi =  4.6364760900080611433E-1    , /*Hex  2^ -1   *  .ED63382B0DDA7B */
-/*athflo =  1.9338828231967579916E-19   , /*Hex  2^-62   *  .E450059CFE92C0 */
-/*PIo4   =  7.8539816339744830676E-1    , /*Hex  2^  0   *  .C90FDAA22168C2 */ 
-/*at1fhi =  9.8279372324732906796E-1    , /*Hex  2^  0   *  .FB985E940FB4D9 */
-/*at1flo = -3.5540295636764633916E-18   , /*Hex  2^-57   * -.831EDC34D6EAEA */
-/*PIo2   =  1.5707963267948966135E0     , /*Hex  2^  1   *  .C90FDAA22168C2 */
-/*PI     =  3.1415926535897932270E0     , /*Hex  2^  2   *  .C90FDAA22168C2 */
-/*a1     =  3.3333333333333473730E-1    , /*Hex  2^ -1   *  .AAAAAAAAAAAB75 */
-/*a2     = -2.0000000000017730678E-1    , /*Hex  2^ -2   * -.CCCCCCCCCD946E */
-/*a3     =  1.4285714286694640301E-1    , /*Hex  2^ -2   *  .92492492744262 */
-/*a4     = -1.1111111135032672795E-1    , /*Hex  2^ -3   * -.E38E38EBC66292 */
-/*a5     =  9.0909091380563043783E-2    , /*Hex  2^ -3   *  .BA2E8BB31BD70C */
-/*a6     = -7.6922954286089459397E-2    , /*Hex  2^ -3   * -.9D89C827C37F18 */
-/*a7     =  6.6663180891693915586E-2    , /*Hex  2^ -3   *  .8886B4AE379E58 */
-/*a8     = -5.8772703698290408927E-2    , /*Hex  2^ -4   * -.F0BBA58481A942 */
-/*a9     =  5.2170707402812969804E-2    , /*Hex  2^ -4   *  .D5B0F3A1AB13AB */
-/*a10    = -4.4895863157820361210E-2    , /*Hex  2^ -4   * -.B7E4B97FD1048F */
-/*a11    =  3.3006147437343875094E-2    , /*Hex  2^ -4   *  .8731743CF72D87 */
-/*a12    = -1.4614844866464185439E-2    ; /*Hex  2^ -6   * -.EF731A2F3476D9 */
-static long athfhix[] = { _0x(6338,3fed), _0x(da7b,2b0d)};
-#define athfhi (*(double *)athfhix)
-static long athflox[] = { _0x(5005,2164), _0x(92c0,9cfe)};
-#define athflo (*(double *)athflox)
-static long   PIo4x[] = { _0x(0fda,4049), _0x(68c2,a221)};
-#define   PIo4 (*(double *)PIo4x)
-static long at1fhix[] = { _0x(985e,407b), _0x(b4d9,940f)};
-#define at1fhi (*(double *)at1fhix)
-static long at1flox[] = { _0x(1edc,a383), _0x(eaea,34d6)};
-#define at1flo (*(double *)at1flox)
-static long   PIo2x[] = { _0x(0fda,40c9), _0x(68c2,a221)};
-#define   PIo2 (*(double *)PIo2x)
-static long     PIx[] = { _0x(0fda,4149), _0x(68c2,a221)};
-#define     PI (*(double *)PIx)
-static long     a1x[] = { _0x(aaaa,3faa), _0x(ab75,aaaa)};
-#define     a1 (*(double *)a1x)
-static long     a2x[] = { _0x(cccc,bf4c), _0x(946e,cccd)};
-#define     a2 (*(double *)a2x)
-static long     a3x[] = { _0x(4924,3f12), _0x(4262,9274)};
-#define     a3 (*(double *)a3x)
-static long     a4x[] = { _0x(8e38,bee3), _0x(6292,ebc6)};
-#define     a4 (*(double *)a4x)
-static long     a5x[] = { _0x(2e8b,3eba), _0x(d70c,b31b)};
-#define     a5 (*(double *)a5x)
-static long     a6x[] = { _0x(89c8,be9d), _0x(7f18,27c3)};
-#define     a6 (*(double *)a6x)
-static long     a7x[] = { _0x(86b4,3e88), _0x(9e58,ae37)};
-#define     a7 (*(double *)a7x)
-static long     a8x[] = { _0x(bba5,be70), _0x(a942,8481)};
-#define     a8 (*(double *)a8x)
-static long     a9x[] = { _0x(b0f3,3e55), _0x(13ab,a1ab)};
-#define     a9 (*(double *)a9x)
-static long    a10x[] = { _0x(e4b9,be37), _0x(048f,7fd1)};
-#define    a10 (*(double *)a10x)
-static long    a11x[] = { _0x(3174,3e07), _0x(2d87,3cf7)};
-#define    a11 (*(double *)a11x)
-static long    a12x[] = { _0x(731a,bd6f), _0x(76d9,2f34)};
-#define    a12 (*(double *)a12x)
-#else  /* IEEE double */
-static double 
-athfhi =  4.6364760900080609352E-1    , /*Hex  2^ -2   *  1.DAC670561BB4F */
-athflo =  4.6249969567426939759E-18   , /*Hex  2^-58   *  1.5543B8F253271 */
-PIo4   =  7.8539816339744827900E-1    , /*Hex  2^ -1   *  1.921FB54442D18 */
-at1fhi =  9.8279372324732905408E-1    , /*Hex  2^ -1   *  1.F730BD281F69B */
-at1flo = -2.4407677060164810007E-17   , /*Hex  2^-56   * -1.C23DFEFEAE6B5 */
-PIo2   =  1.5707963267948965580E0     , /*Hex  2^  0   *  1.921FB54442D18 */
-PI     =  3.1415926535897931160E0     , /*Hex  2^  1   *  1.921FB54442D18 */
-a1     =  3.3333333333333942106E-1    , /*Hex  2^ -2   *  1.55555555555C3 */
-a2     = -1.9999999999979536924E-1    , /*Hex  2^ -3   * -1.9999999997CCD */
-a3     =  1.4285714278004377209E-1    , /*Hex  2^ -3   *  1.24924921EC1D7 */
-a4     = -1.1111110579344973814E-1    , /*Hex  2^ -4   * -1.C71C7059AF280 */
-a5     =  9.0908906105474668324E-2    , /*Hex  2^ -4   *  1.745CE5AA35DB2 */
-a6     = -7.6919217767468239799E-2    , /*Hex  2^ -4   * -1.3B0FA54BEC400 */
-a7     =  6.6614695906082474486E-2    , /*Hex  2^ -4   *  1.10DA924597FFF */
-a8     = -5.8358371008508623523E-2    , /*Hex  2^ -5   * -1.DE125FDDBD793 */
-a9     =  4.9850617156082015213E-2    , /*Hex  2^ -5   *  1.9860524BDD807 */
-a10    = -3.6700606902093604877E-2    , /*Hex  2^ -5   * -1.2CA6C04C6937A */
-a11    =  1.6438029044759730479E-2    ; /*Hex  2^ -6   *  1.0D52174A1BB54 */
+#include "mathimpl.h"
+
+vc(athfhi, 4.6364760900080611433E-1  ,6338,3fed,da7b,2b0d,  -1, .ED63382B0DDA7B)
+vc(athflo, 1.9338828231967579916E-19 ,5005,2164,92c0,9cfe, -62, .E450059CFE92C0)
+vc(PIo4,   7.8539816339744830676E-1  ,0fda,4049,68c2,a221,   0, .C90FDAA22168C2)
+vc(at1fhi, 9.8279372324732906796E-1  ,985e,407b,b4d9,940f,   0, .FB985E940FB4D9)
+vc(at1flo,-3.5540295636764633916E-18 ,1edc,a383,eaea,34d6, -57,-.831EDC34D6EAEA)
+vc(PIo2,   1.5707963267948966135E0   ,0fda,40c9,68c2,a221,   1, .C90FDAA22168C2)
+vc(PI,     3.1415926535897932270E0   ,0fda,4149,68c2,a221,   2, .C90FDAA22168C2)
+vc(a1,     3.3333333333333473730E-1  ,aaaa,3faa,ab75,aaaa,  -1, .AAAAAAAAAAAB75)
+vc(a2,    -2.0000000000017730678E-1  ,cccc,bf4c,946e,cccd,  -2,-.CCCCCCCCCD946E)
+vc(a3,     1.4285714286694640301E-1  ,4924,3f12,4262,9274,  -2, .92492492744262)
+vc(a4,    -1.1111111135032672795E-1  ,8e38,bee3,6292,ebc6,  -3,-.E38E38EBC66292)
+vc(a5,     9.0909091380563043783E-2  ,2e8b,3eba,d70c,b31b,  -3, .BA2E8BB31BD70C)
+vc(a6,    -7.6922954286089459397E-2  ,89c8,be9d,7f18,27c3,  -3,-.9D89C827C37F18)
+vc(a7,     6.6663180891693915586E-2  ,86b4,3e88,9e58,ae37,  -3, .8886B4AE379E58)
+vc(a8,    -5.8772703698290408927E-2  ,bba5,be70,a942,8481,  -4,-.F0BBA58481A942)
+vc(a9,     5.2170707402812969804E-2  ,b0f3,3e55,13ab,a1ab,  -4, .D5B0F3A1AB13AB)
+vc(a10,   -4.4895863157820361210E-2  ,e4b9,be37,048f,7fd1,  -4,-.B7E4B97FD1048F)
+vc(a11,    3.3006147437343875094E-2  ,3174,3e07,2d87,3cf7,  -4, .8731743CF72D87)
+vc(a12,   -1.4614844866464185439E-2  ,731a,bd6f,76d9,2f34,  -6,-.EF731A2F3476D9)
+
+ic(athfhi, 4.6364760900080609352E-1  ,  -2,  1.DAC670561BB4F)
+ic(athflo, 4.6249969567426939759E-18 , -58,  1.5543B8F253271)
+ic(PIo4,   7.8539816339744827900E-1  ,  -1,  1.921FB54442D18)
+ic(at1fhi, 9.8279372324732905408E-1  ,  -1,  1.F730BD281F69B)
+ic(at1flo,-2.4407677060164810007E-17 , -56, -1.C23DFEFEAE6B5)
+ic(PIo2,   1.5707963267948965580E0   ,   0,  1.921FB54442D18)
+ic(PI,     3.1415926535897931160E0   ,   1,  1.921FB54442D18)
+ic(a1,     3.3333333333333942106E-1  ,  -2,  1.55555555555C3)
+ic(a2,    -1.9999999999979536924E-1  ,  -3, -1.9999999997CCD)
+ic(a3,     1.4285714278004377209E-1  ,  -3,  1.24924921EC1D7)
+ic(a4,    -1.1111110579344973814E-1  ,  -4, -1.C71C7059AF280)
+ic(a5,     9.0908906105474668324E-2  ,  -4,  1.745CE5AA35DB2)
+ic(a6,    -7.6919217767468239799E-2  ,  -4, -1.3B0FA54BEC400)
+ic(a7,     6.6614695906082474486E-2  ,  -4,  1.10DA924597FFF)
+ic(a8,    -5.8358371008508623523E-2  ,  -5, -1.DE125FDDBD793)
+ic(a9,     4.9850617156082015213E-2  ,  -5,  1.9860524BDD807)
+ic(a10,   -3.6700606902093604877E-2  ,  -5, -1.2CA6C04C6937A)
+ic(a11,    1.6438029044759730479E-2  ,  -6,  1.0D52174A1BB54)
+
+#ifdef vccast
+#define        athfhi  vccast(athfhi)
+#define        athflo  vccast(athflo)
+#define        PIo4    vccast(PIo4)
+#define        at1fhi  vccast(at1fhi)
+#define        at1flo  vccast(at1flo)
+#define        PIo2    vccast(PIo2)
+#define        PI      vccast(PI)
+#define        a1      vccast(a1)
+#define        a2      vccast(a2)
+#define        a3      vccast(a3)
+#define        a4      vccast(a4)
+#define        a5      vccast(a5)
+#define        a6      vccast(a6)
+#define        a7      vccast(a7)
+#define        a8      vccast(a8)
+#define        a9      vccast(a9)
+#define        a10     vccast(a10)
+#define        a11     vccast(a11)
+#define        a12     vccast(a12)
 #endif
 
 double atan2(y,x)
 double  y,x;
 {  
 #endif
 
 double atan2(y,x)
 double  y,x;
 {  
-       static double zero=0, one=1, small=1.0E-9, big=1.0E18;
-       double copysign(),logb(),scalb(),t,z,signy,signx,hi,lo;
-       int finite(), k,m;
+       static const double zero=0, one=1, small=1.0E-9, big=1.0E18;
+       double t,z,signy,signx,hi,lo;
+       int k,m;
 
 
+#if !defined(vax)&&!defined(tahoe)
     /* if x or y is NAN */
        if(x!=x) return(x); if(y!=y) return(y);
     /* if x or y is NAN */
        if(x!=x) return(x); if(y!=y) return(y);
+#endif /* !defined(vax)&&!defined(tahoe) */
 
     /* copy down the sign of y and x */
        signy = copysign(one,y) ;  
 
     /* copy down the sign of y and x */
        signy = copysign(one,y) ;  
@@ -209,7 +198,6 @@ double  y,x;
     /* when y is INF */
        if(!finite(y)) return(copysign(PIo2,signy));
 
     /* when y is INF */
        if(!finite(y)) return(copysign(PIo2,signy));
 
-
     /* compute y/x */
        x=copysign(x,one); 
        y=copysign(y,one); 
     /* compute y/x */
        x=copysign(x,one); 
        y=copysign(y,one); 
@@ -271,13 +259,13 @@ begin:
 
     /* compute atan(t) for t in [-.4375, .4375] */
        z = t*t;
 
     /* compute atan(t) for t in [-.4375, .4375] */
        z = t*t;
-#if (defined(VAX)||defined(TAHOE))
+#if defined(vax)||defined(tahoe)
        z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
                        z*(a9+z*(a10+z*(a11+z*a12))))))))))));
        z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
                        z*(a9+z*(a10+z*(a11+z*a12))))))))))));
-#else  /* IEEE double */
+#else  /* defined(vax)||defined(tahoe) */
        z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
                        z*(a9+z*(a10+z*a11)))))))))));
        z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
                        z*(a9+z*(a10+z*a11)))))))))));
-#endif
+#endif /* defined(vax)||defined(tahoe) */
        z = lo - z; z += t; z += hi;
 
        return(copysign((signx>zero)?z:PI-z,signy));
        z = lo - z; z += t; z += hi;
 
        return(copysign((signx>zero)?z:PI-z,signy));