elf: Ignore LD_LIBRARY_PATH and debug env var for setuid for static
[glibc.git] / sysdeps / ieee754 / dbl-64 / s_ceil.c
blob373821136079820c4d86d28bb07f4d2f50a16b58
1 /* @(#)s_ceil.c 5.1 93/09/24 */
2 /*
3 * ====================================================
4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
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 * ====================================================
14 * ceil(x)
15 * Return x rounded toward -inf to integral value
16 * Method:
17 * Bit twiddling.
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>
26 double
27 __ceil (double x)
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)
39 if (j0 < 0)
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);
47 else
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;
57 else
59 if (j0 == 0x400)
60 return x + x; /* inf or NaN */
61 else
62 return x; /* x is integral */
64 INSERT_WORDS64 (x, i0);
65 return x;
66 #endif /* ! USE_CEIL_BUILTIN */
68 #ifndef __ceil
69 libm_alias_double (__ceil, ceil)
70 #endif