(root)/
glibc-2.38/
sysdeps/
ieee754/
dbl-64/
s_ceil.c
       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
       8   * software is freely granted, provided that this notice
       9   * is preserved.
      10   * ====================================================
      11   */
      12  
      13  /*
      14   * ceil(x)
      15   * Return x rounded toward -inf to integral value
      16   * Method:
      17   *	Bit twiddling.
      18   */
      19  
      20  #define NO_MATH_REDIRECT
      21  #include <math.h>
      22  #include <math_private.h>
      23  #include <libm-alias-double.h>
      24  #include <math-use-builtins.h>
      25  
      26  double
      27  __ceil (double x)
      28  {
      29  #if USE_CEIL_BUILTIN
      30    return __builtin_ceil (x);
      31  #else
      32    /* Use generic implementation.  */
      33    int64_t i0, i;
      34    int32_t j0;
      35    EXTRACT_WORDS64 (i0, x);
      36    j0 = ((i0 >> 52) & 0x7ff) - 0x3ff;
      37    if (j0 <= 51)
      38      {
      39        if (j0 < 0)
      40  	{
      41  	  /* return 0 * sign(x) if |x| < 1  */
      42  	  if (i0 < 0)
      43  	    i0 = INT64_C (0x8000000000000000);
      44  	  else if (i0 != 0)
      45  	    i0 = INT64_C (0x3ff0000000000000);
      46  	}
      47        else
      48  	{
      49  	  i = INT64_C (0x000fffffffffffff) >> j0;
      50  	  if ((i0 & i) == 0)
      51  	    return x;			/* x is integral  */
      52  	  if (i0 > 0)
      53  	    i0 += UINT64_C (0x0010000000000000) >> j0;
      54  	  i0 &= ~i;
      55  	}
      56      }
      57    else
      58      {
      59        if (j0 == 0x400)
      60  	return x + x;			/* inf or NaN  */
      61        else
      62  	return x;			/* x is integral  */
      63      }
      64    INSERT_WORDS64 (x, i0);
      65    return x;
      66  #endif /* ! USE_CEIL_BUILTIN  */
      67  }
      68  #ifndef __ceil
      69  libm_alias_double (__ceil, ceil)
      70  #endif