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
__ceil(double x)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
71