summary refs log tree commit diff
path: root/stdlib/erand48_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/erand48_r.c')
-rw-r--r--stdlib/erand48_r.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/stdlib/erand48_r.c b/stdlib/erand48_r.c
index a2a0f58c14..958c2e2799 100644
--- a/stdlib/erand48_r.c
+++ b/stdlib/erand48_r.c
@@ -17,6 +17,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <ieee754.h>
 #include <stdlib.h>
 #include <limits.h>
 
@@ -27,6 +28,8 @@ erand48_r (xsubi, buffer, result)
      struct drand48_data *buffer;
      double *result;
 {
+  union ieee754_double temp;
+
   /* Compute next state.  */
   if (__drand48_iterate (xsubi, buffer) < 0)
     return -1;
@@ -35,9 +38,12 @@ erand48_r (xsubi, buffer, result)
      its fractional part so the resulting FP number is [0.0,1.0).  */
 
 #if USHRT_MAX == 65535
-  *result = ((double) xsubi[2] / (1ULL << 48) +
-	     (double) xsubi[1] / (1ULL << 32) +
-	     (double) xsubi[0] / (1ULL << 16));
+  temp.ieee.negative = 0;
+  temp.ieee.exponent = IEEE754_DOUBLE_BIAS - 1;
+  temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12);
+  temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4);
+  /* Please note the lower 4 bits of mantissa1 are always 0.  */
+  *result = temp.d;
 #else
 # error Unsupported size of short int
 #endif