BSD 4_3_Net_2 release
[unix-history] / usr / src / lib / libm / ieee / cabs.c
index ba040ef..f40a7e7 100644 (file)
@@ -1,41 +1,39 @@
-/* 
+/*
  * 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.2 (Berkeley) 8/21/85; 1.4 (ucb.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, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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.
  *
  *
- * Method :
- *     cabs(z) = hypot(x,y) .
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
  */
 
-double cabs(z)
-struct { double x, y;} z;
-{
-       double hypot();
-       return(hypot(z.x,z.y));
-}
-
+#ifndef lint
+static char sccsid[] = "@(#)cabs.c     5.6 (Berkeley) 10/9/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
@@ -89,38 +87,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)
 
 
-#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 */
-/* 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[] = { _0x(8279,411a), _0x(ef32,99fc)};
-static long    r2p1lox[] = { _0x(597d,2484), _0x(754b,89b3)};
-static long     sqrt2x[] = { _0x(04f3,40b5), _0x(de65,33f9)};
-#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))
@@ -160,20 +151,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))