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
26double
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
69libm_alias_double (__ceil, ceil)
70#endif
71

source code of glibc/sysdeps/ieee754/dbl-64/s_ceil.c