[BACK]Return to s_floor.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libm / src

Annotation of src/lib/libm/src/s_floor.c, Revision 1.13.12.1

1.1       jtc         1: /* @(#)s_floor.c 5.1 93/09/24 */
                      2: /*
                      3:  * ====================================================
                      4:  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
                      5:  *
                      6:  * Developed at SunPro, a Sun Microsystems, Inc. business.
                      7:  * Permission to use, copy, modify, and distribute this
1.10      simonb      8:  * software is freely granted, provided that this notice
1.1       jtc         9:  * is preserved.
                     10:  * ====================================================
                     11:  */
1.3       jtc        12:
1.9       lukem      13: #include <sys/cdefs.h>
1.7       jtc        14: #if defined(LIBM_SCCS) && !defined(lint)
1.13.12.1! tls        15: __RCSID("$NetBSD$");
1.3       jtc        16: #endif
1.1       jtc        17:
                     18: /*
                     19:  * floor(x)
                     20:  * Return x rounded toward -inf to integral value
                     21:  * Method:
                     22:  *     Bit twiddling.
                     23:  * Exception:
                     24:  *     Inexact flag raised if x not equal to floor(x).
                     25:  */
                     26:
1.5       jtc        27: #include "math.h"
                     28: #include "math_private.h"
1.1       jtc        29:
1.13.12.1! tls        30: #ifndef __HAVE_LONG_DOUBLE
        !            31: __strong_alias(_floorl, floor)
        !            32: __weak_alias(floorl, floor)
        !            33: #endif
        !            34:
1.4       jtc        35: static const double huge = 1.0e300;
1.1       jtc        36:
1.11      wiz        37: double
                     38: floor(double x)
1.1       jtc        39: {
1.12      christos   40:        int32_t i0,i1,jj0;
1.6       jtc        41:        u_int32_t i,j;
1.5       jtc        42:        EXTRACT_WORDS(i0,i1,x);
1.12      christos   43:        jj0 = ((i0>>20)&0x7ff)-0x3ff;
                     44:        if(jj0<20) {
                     45:            if(jj0<0) {         /* raise inexact if x != 0 */
1.1       jtc        46:                if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
1.10      simonb     47:                    if(i0>=0) {i0=i1=0;}
1.1       jtc        48:                    else if(((i0&0x7fffffff)|i1)!=0)
                     49:                        { i0=0xbff00000;i1=0;}
                     50:                }
                     51:            } else {
1.12      christos   52:                i = (0x000fffff)>>jj0;
1.1       jtc        53:                if(((i0&i)|i1)==0) return x; /* x is integral */
                     54:                if(huge+x>0.0) {        /* raise inexact flag */
1.12      christos   55:                    if(i0<0) i0 += (0x00100000)>>jj0;
1.1       jtc        56:                    i0 &= (~i); i1=0;
                     57:                }
                     58:            }
1.12      christos   59:        } else if (jj0>51) {
                     60:            if(jj0==0x400) return x+x;  /* inf or NaN */
1.1       jtc        61:            else return x;              /* x is integral */
                     62:        } else {
1.12      christos   63:            i = ((u_int32_t)(0xffffffff))>>(jj0-20);
1.1       jtc        64:            if((i1&i)==0) return x;     /* x is integral */
                     65:            if(huge+x>0.0) {            /* raise inexact flag */
                     66:                if(i0<0) {
1.12      christos   67:                    if(jj0==20) i0+=1;
1.1       jtc        68:                    else {
1.12      christos   69:                        j = i1+(1<<(52-jj0));
1.13      lukem      70:                        if(j<(u_int32_t)i1) i0 +=1 ;    /* got a carry */
1.1       jtc        71:                        i1=j;
                     72:                    }
                     73:                }
                     74:                i1 &= (~i);
                     75:            }
                     76:        }
1.5       jtc        77:        INSERT_WORDS(x,i0,i1);
1.1       jtc        78:        return x;
                     79: }

CVSweb <webmaster@jp.NetBSD.org>