BSD 4_3_Reno release
[unix-history] / usr / src / lib / libm / ieee / cabs.c
index 79fcabe..3474912 100644 (file)
@@ -1,40 +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.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cabs.c     1.1 (ELEFUNT) %G%";
-#endif not lint
-
-/* CABS(Z)
- * RETURN THE ABSOLUTE VALUE OF THE COMPLEX NUMBER  Z = X + iY
- * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
- * CODED IN C BY K.C. NG, 11/28/84.
- * REVISED BY K.C. NG, 7/12/85.
+ * All rights reserved.
  *
  *
- * Required kernel function :
- *     hypot(x,y)
+ * 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.
  *
  *
- * Method :
- *     cabs(z) = hypot(x,y) .
+ * 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.
  */
 
  */
 
-double cabs(z)
-struct { double x, y;} z;
-{
-       double hypot();
-       return(hypot(z.x,z.y));
-}
-
+#ifndef lint
+static char sccsid[] = "@(#)cabs.c     5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 /* HYPOT(X,Y)
  * RETURN THE SQUARE ROOT OF X^2 + Y^2  WHERE Z=X+iY
 
 /* HYPOT(X,Y)
  * RETURN THE SQUARE ROOT OF X^2 + Y^2  WHERE Z=X+iY
@@ -88,33 +78,31 @@ struct { double x, y;} z;
  * from decimal to binary accurately enough to produce the hexadecimal values
  * shown.
  */
  * from decimal to binary accurately enough to produce the hexadecimal values
  * shown.
  */
+#include "mathimpl.h"
+
+vc(r2p1hi, 2.4142135623730950345E0   ,8279,411a,ef32,99fc,   2, .9A827999FCEF32)
+vc(r2p1lo, 1.4349369327986523769E-17 ,597d,2484,754b,89b3, -55, .84597D89B3754B)
+vc(sqrt2,  1.4142135623730950622E0   ,04f3,40b5,de65,33f9,   1, .B504F333F9DE65)
 
 
-#ifdef VAX     /* VAX D format */
-/* static double */
-/* r2p1hi =  2.4142135623730950345E0     , Hex  2^  2   *  .9A827999FCEF32 */
-/* r2p1lo =  1.4349369327986523769E-17   , Hex  2^-55   *  .84597D89B3754B */
-/* sqrt2  =  1.4142135623730950622E0     ; Hex  2^  1   *  .B504F333F9DE65 */
-static long    r2p1hix[] = { 0x8279411a, 0xef3299fc};
-static long    r2p1lox[] = { 0x597d2484, 0x754b89b3};
-static long     sqrt2x[] = { 0x04f340b5, 0xde6533f9};
-#define   r2p1hi    (*(double*)r2p1hix)
-#define   r2p1lo    (*(double*)r2p1lox)
-#define    sqrt2    (*(double*)sqrt2x)
-#else          /* IEEE double format */
-static double
-r2p1hi =  2.4142135623730949234E0     , /*Hex  2^1     *  1.3504F333F9DE6 */
-r2p1lo =  1.2537167179050217666E-16   , /*Hex  2^-53   *  1.21165F626CDD5 */
-sqrt2  =  1.4142135623730951455E0     ; /*Hex  2^  0   *  1.6A09E667F3BCD */
+ic(r2p1hi, 2.4142135623730949234E0   ,   1, 1.3504F333F9DE6)
+ic(r2p1lo, 1.2537167179050217666E-16 , -53, 1.21165F626CDD5)
+ic(sqrt2,  1.4142135623730951455E0   ,   0, 1.6A09E667F3BCD)
+
+#ifdef vccast
+#define        r2p1hi  vccast(r2p1hi)
+#define        r2p1lo  vccast(r2p1lo)
+#define        sqrt2   vccast(sqrt2)
 #endif
 
 #endif
 
-double hypot(x,y)
+double
+hypot(x,y)
 double x, y;
 {
 double x, y;
 {
-       static double zero=0, one=1, 
+       static const double zero=0, one=1, 
                      small=1.0E-18;    /* fl(1+small)==1 */
                      small=1.0E-18;    /* fl(1+small)==1 */
-       static ibig=30; /* fl(1+2**(2*ibig))==1 */
-       double copysign(),scalb(),logb(),sqrt(),t,r;
-       int finite(), exp;
+       static const ibig=30;   /* fl(1+2**(2*ibig))==1 */
+       double t,r;
+       int exp;
 
        if(finite(x))
            if(finite(y))
 
        if(finite(x))
            if(finite(y))
@@ -154,20 +142,49 @@ double x, y;
                 return (copysign(x,one));
        else if(finite(y))
                 return(x);                /* x is NaN, y is finite */
                 return (copysign(x,one));
        else if(finite(y))
                 return(x);                /* x is NaN, y is finite */
+#if !defined(vax)&&!defined(tahoe)
        else if(y!=y) return(y);  /* x and y is NaN */
        else if(y!=y) return(y);  /* x and y is NaN */
+#endif /* !defined(vax)&&!defined(tahoe) */
        else return(copysign(y,one));   /* y is INF */
 }
 
        else return(copysign(y,one));   /* y is INF */
 }
 
+/* CABS(Z)
+ * RETURN THE ABSOLUTE VALUE OF THE COMPLEX NUMBER  Z = X + iY
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 11/28/84.
+ * REVISED BY K.C. NG, 7/12/85.
+ *
+ * Required kernel function :
+ *     hypot(x,y)
+ *
+ * Method :
+ *     cabs(z) = hypot(x,y) .
+ */
+
+double
+cabs(z)
+struct { double x, y;} z;
+{
+       return hypot(z.x,z.y);
+}
+
+double
+z_abs(z)
+struct { double x,y;} *z;
+{
+       return hypot(z->x,z->y);
+}
+
 /* A faster but less accurate version of cabs(x,y) */
 #if 0
 double hypot(x,y)
 double x, y;
 {
 /* A faster but less accurate version of cabs(x,y) */
 #if 0
 double hypot(x,y)
 double x, y;
 {
-       static double zero=0, one=1;
+       static const double zero=0, one=1;
                      small=1.0E-18;    /* fl(1+small)==1 */
                      small=1.0E-18;    /* fl(1+small)==1 */
-       static ibig=30; /* fl(1+2**(2*ibig))==1 */
-       double copysign(),scalb(),logb(),sqrt(),temp;
-       int finite(), exp;
+       static const ibig=30;   /* fl(1+2**(2*ibig))==1 */
+       double temp;
+       int exp;
 
        if(finite(x))
            if(finite(y))
 
        if(finite(x))
            if(finite(y))