New module 'fpucw'.
[gnulib.git] / lib / frexp.c
index 3074f2e..701f00e 100644 (file)
@@ -28,6 +28,7 @@
 # include <float.h>
 # ifdef USE_LONG_DOUBLE
 #  include "isnanl-nolibm.h"
+#  include "fpucw.h"
 # else
 #  include "isnan.h"
 # endif
 #  define FUNC frexpl
 #  define DOUBLE long double
 #  define ISNAN isnanl
+#  define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+#  define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+#  define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
 #  define L_(literal) literal##L
 # else
 #  define FUNC frexp
 #  define DOUBLE double
 #  define ISNAN isnan
+#  define DECL_ROUNDING
+#  define BEGIN_ROUNDING()
+#  define END_ROUNDING()
 #  define L_(literal) literal
 # endif
 
@@ -53,6 +60,7 @@ FUNC (DOUBLE x, int *exp)
 {
   int sign;
   int exponent;
+  DECL_ROUNDING
 
   /* Test for NaN, infinity, and zero.  */
   if (ISNAN (x) || x + x == x)
@@ -68,6 +76,8 @@ FUNC (DOUBLE x, int *exp)
       sign = -1;
     }
 
+  BEGIN_ROUNDING ();
+
   {
     /* Since the exponent is an 'int', it fits in 64 bits.  Therefore the
        loops are executed no more than 64 times.  */
@@ -149,8 +159,13 @@ FUNC (DOUBLE x, int *exp)
     /* Here 0.5 <= x < 1.0.  */
   }
 
+  if (sign < 0)
+    x = - x;
+
+  END_ROUNDING ();
+
   *exp = exponent;
-  return (sign < 0 ? - x : x);
+  return x;
 }
 
 #else