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

Annotation of src/lib/libm/src/s_ceil.c, Revision 1.14

1.1       jtc         1: /* @(#)s_ceil.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.14    ! joerg      15: __RCSID("$NetBSD: s_ceil.c,v 1.13 2009/02/16 01:22:18 lukem Exp $");
1.3       jtc        16: #endif
1.1       jtc        17:
                     18: /*
                     19:  * ceil(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 ceil(x).
                     25:  */
                     26:
1.5       jtc        27: #include "math.h"
                     28: #include "math_private.h"
1.1       jtc        29:
1.4       jtc        30: static const double huge = 1.0e300;
1.1       jtc        31:
1.14    ! joerg      32: #ifndef __HAVE_LONG_DOUBLE
        !            33: __strong_alias(_ceill, ceil)
        !            34: __weak_alias(ceill, ceil)
        !            35: #endif
        !            36:
1.11      wiz        37: double
                     38: ceil(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=0x80000000;i1=0;}
1.1       jtc        48:                    else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
                     49:                }
                     50:            } else {
1.12      christos   51:                i = (0x000fffff)>>jj0;
1.1       jtc        52:                if(((i0&i)|i1)==0) return x; /* x is integral */
                     53:                if(huge+x>0.0) {        /* raise inexact flag */
1.12      christos   54:                    if(i0>0) i0 += (0x00100000)>>jj0;
1.1       jtc        55:                    i0 &= (~i); i1=0;
                     56:                }
                     57:            }
1.12      christos   58:        } else if (jj0>51) {
                     59:            if(jj0==0x400) return x+x;  /* inf or NaN */
1.1       jtc        60:            else return x;              /* x is integral */
                     61:        } else {
1.12      christos   62:            i = ((u_int32_t)(0xffffffff))>>(jj0-20);
1.1       jtc        63:            if((i1&i)==0) return x;     /* x is integral */
                     64:            if(huge+x>0.0) {            /* raise inexact flag */
                     65:                if(i0>0) {
1.12      christos   66:                    if(jj0==20) i0+=1;
1.1       jtc        67:                    else {
1.12      christos   68:                        j = i1 + (1<<(52-jj0));
1.13      lukem      69:                        if(j<(u_int32_t)i1) i0+=1;      /* got a carry */
1.1       jtc        70:                        i1 = j;
                     71:                    }
                     72:                }
                     73:                i1 &= (~i);
                     74:            }
                     75:        }
1.5       jtc        76:        INSERT_WORDS(x,i0,i1);
1.1       jtc        77:        return x;
                     78: }

CVSweb <webmaster@jp.NetBSD.org>