Numworks Epsilon  1.4.1
Graphing Calculator Operating System
s_ceil.c
Go to the documentation of this file.
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  * Exception:
19  * Inexact flag raised if x not equal to ceil(x).
20  */
21 
22 #include "math.h"
23 #include "math_private.h"
24 
25 static const double huge = 1.0e300;
26 
27 double
28 ceil(double x)
29 {
30  int32_t i0,i1,jj0;
31  u_int32_t i,j;
32  EXTRACT_WORDS(i0,i1,x);
33  jj0 = ((i0>>20)&0x7ff)-0x3ff;
34  if(jj0<20) {
35  if(jj0<0) { /* raise inexact if x != 0 */
36  if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
37  if(i0<0) {i0=0x80000000;i1=0;}
38  else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
39  }
40  } else {
41  i = (0x000fffff)>>jj0;
42  if(((i0&i)|i1)==0) return x; /* x is integral */
43  if(huge+x>0.0) { /* raise inexact flag */
44  if(i0>0) i0 += (0x00100000)>>jj0;
45  i0 &= (~i); i1=0;
46  }
47  }
48  } else if (jj0>51) {
49  if(jj0==0x400) return x+x; /* inf or NaN */
50  else return x; /* x is integral */
51  } else {
52  i = ((u_int32_t)(0xffffffff))>>(jj0-20);
53  if((i1&i)==0) return x; /* x is integral */
54  if(huge+x>0.0) { /* raise inexact flag */
55  if(i0>0) {
56  if(jj0==20) i0+=1;
57  else {
58  j = i1 + (1<<(52-jj0));
59  if(j<i1) i0+=1; /* got a carry */
60  i1 = j;
61  }
62  }
63  i1 &= (~i);
64  }
65  }
66  INSERT_WORDS(x,i0,i1);
67  return x;
68 }
uint32_t u_int32_t
Definition: types.h:10
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:259
#define INSERT_WORDS(d, ix0, ix1)
Definition: math_private.h:287
double ceil(double x)
Definition: s_ceil.c:28
signed int int32_t
Definition: stdint.h:11