about summary refs log tree commit diff
path: root/sysdeps/ieee754/dbl-64/s_floor.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ieee754/dbl-64/s_floor.c')
-rw-r--r--sysdeps/ieee754/dbl-64/s_floor.c91
1 files changed, 57 insertions, 34 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_floor.c b/sysdeps/ieee754/dbl-64/s_floor.c
index 5c7297842c..bd6afa72e8 100644
--- a/sysdeps/ieee754/dbl-64/s_floor.c
+++ b/sysdeps/ieee754/dbl-64/s_floor.c
@@ -24,44 +24,67 @@
 
 static const double huge = 1.0e300;
 
-double __floor(double x)
+double
+__floor (double x)
 {
-	int32_t i0,i1,j0;
-	u_int32_t i,j;
-	EXTRACT_WORDS(i0,i1,x);
-	j0 = ((i0>>20)&0x7ff)-0x3ff;
-	if(j0<20) {
-	    if(j0<0) {	/* raise inexact if x != 0 */
-		math_force_eval(huge+x);/* return 0*sign(x) if |x|<1 */
-		if(i0>=0) {i0=i1=0;}
-		else if(((i0&0x7fffffff)|i1)!=0)
-		  { i0=0xbff00000;i1=0;}
-	    } else {
-		i = (0x000fffff)>>j0;
-		if(((i0&i)|i1)==0) return x; /* x is integral */
-		math_force_eval(huge+x);	/* raise inexact flag */
-		if(i0<0) i0 += (0x00100000)>>j0;
-		i0 &= (~i); i1=0;
+  int32_t i0, i1, j0;
+  u_int32_t i, j;
+  EXTRACT_WORDS (i0, i1, x);
+  j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
+  if (j0 < 20)
+    {
+      if (j0 < 0)       /* raise inexact if x != 0 */
+	{
+	  math_force_eval (huge + x);   /* return 0*sign(x) if |x|<1 */
+	  if (i0 >= 0)
+	    {
+	      i0 = i1 = 0;
 	    }
-	} else if (j0>51) {
-	    if(j0==0x400) return x+x;	/* inf or NaN */
-	    else return x;		/* x is integral */
-	} else {
-	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
-	    if((i1&i)==0) return x;	/* x is integral */
-	    math_force_eval(huge+x);		/* raise inexact flag */
-	    if(i0<0) {
-		if(j0==20) i0+=1;
-		else {
-		    j = i1+(1<<(52-j0));
-		    if(j<i1) i0 +=1 ;	/* got a carry */
-		    i1=j;
-		}
+	  else if (((i0 & 0x7fffffff) | i1) != 0)
+	    {
+	      i0 = 0xbff00000; i1 = 0;
 	    }
-	    i1 &= (~i);
 	}
-	INSERT_WORDS(x,i0,i1);
-	return x;
+      else
+	{
+	  i = (0x000fffff) >> j0;
+	  if (((i0 & i) | i1) == 0)
+	    return x;                        /* x is integral */
+	  math_force_eval (huge + x);           /* raise inexact flag */
+	  if (i0 < 0)
+	    i0 += (0x00100000) >> j0;
+	  i0 &= (~i); i1 = 0;
+	}
+    }
+  else if (j0 > 51)
+    {
+      if (j0 == 0x400)
+	return x + x;                   /* inf or NaN */
+      else
+	return x;                       /* x is integral */
+    }
+  else
+    {
+      i = ((u_int32_t) (0xffffffff)) >> (j0 - 20);
+      if ((i1 & i) == 0)
+	return x;                       /* x is integral */
+      math_force_eval (huge + x);               /* raise inexact flag */
+      if (i0 < 0)
+	{
+	  if (j0 == 20)
+	    i0 += 1;
+	  else
+	    {
+	      j = i1 + (1 << (52 - j0));
+	      if (j < i1)
+		i0 += 1;                /* got a carry */
+	      i1 = j;
+	    }
+	}
+      i1 &= (~i);
+    }
+  INSERT_WORDS (x, i0, i1);
+  return x;
 }
 #ifndef __floor
 weak_alias (__floor, floor)