Numworks Epsilon  1.4.1
Graphing Calculator Operating System
s_floor.c
Go to the documentation of this file.
1 /* @(#)s_floor.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  * floor(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 floor(x).
20  */
21 
22 #include "math.h"
23 #include "math_private.h"
24 
25 static const double huge = 1.0e300;
26 
27 double
28 floor(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=i1=0;}
38  else if(((i0&0x7fffffff)|i1)!=0)
39  { i0=0xbff00000;i1=0;}
40  }
41  } else {
42  i = (0x000fffff)>>jj0;
43  if(((i0&i)|i1)==0) return x; /* x is integral */
44  if(huge+x>0.0) { /* raise inexact flag */
45  if(i0<0) i0 += (0x00100000)>>jj0;
46  i0 &= (~i); i1=0;
47  }
48  }
49  } else if (jj0>51) {
50  if(jj0==0x400) return x+x; /* inf or NaN */
51  else return x; /* x is integral */
52  } else {
53  i = ((u_int32_t)(0xffffffff))>>(jj0-20);
54  if((i1&i)==0) return x; /* x is integral */
55  if(huge+x>0.0) { /* raise inexact flag */
56  if(i0<0) {
57  if(jj0==20) i0+=1;
58  else {
59  j = i1+(1<<(52-jj0));
60  if(j<i1) i0 +=1 ; /* got a carry */
61  i1=j;
62  }
63  }
64  i1 &= (~i);
65  }
66  }
67  INSERT_WORDS(x,i0,i1);
68  return x;
69 }
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 floor(double x)
Definition: s_floor.c:28
signed int int32_t
Definition: stdint.h:11