Import gdtoa-20110321. vendor/GDTOA
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:49:59 +0000 (13:49 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:49:59 +0000 (13:49 -1000)
contrib/gdtoa/gdtoa.c
contrib/gdtoa/gdtoa.h
contrib/gdtoa/gdtoaimp.h
contrib/gdtoa/strtod.c

index 4686f63..e15bb2a 100644 (file)
@@ -123,6 +123,7 @@ gdtoa
        the returned string.  If not null, *rve is set to point
        to the end of the return value.  If d is +-Infinity or NaN,
        then *decpt is set to 9999.
+       be = exponent: value = (integer represented by bits) * (2 to the power of be).
 
        mode:
                0 ==> shortest string that yields d when read in
@@ -283,6 +284,8 @@ gdtoa
                mode -= 4;
                try_quick = 0;
                }
+       else if (i >= -4 - Emin || i < Emin)
+               try_quick = 0;
        leftright = 1;
        ilim = ilim1 = -1;      /* Values for cases 0 and 1; done here to */
                                /* silence erroneous "gcc -Wall" warning. */
@@ -500,13 +503,15 @@ gdtoa
        m5 = b5;
        mhi = mlo = 0;
        if (leftright) {
-               if (mode < 2) {
-                       i = nbits - bbits;
-                       if (be - i++ < fpi->emin)
-                               /* denormal */
-                               i = be - fpi->emin + 1;
+               i = nbits - bbits;
+               if (be - i++ < fpi->emin && mode != 3 && mode != 5) {
+                       /* denormal */
+                       i = be - fpi->emin + 1;
+                       if (mode >= 2 && ilim > 0 && ilim < i)
+                               goto small_ilim;
                        }
-               else {
+               else if (mode >= 2) {
+ small_ilim:
                        j = ilim - 1;
                        if (m5 >= j)
                                m5 -= j;
index e59ebf6..f004ec3 100644 (file)
@@ -36,7 +36,7 @@ THIS SOFTWARE.
 #include <stddef.h> /* for size_t */
 
 #ifndef Long
-#define Long long
+#define Long int
 #endif
 #ifndef ULong
 typedef unsigned Long ULong;
index 2c188d6..d2680c6 100644 (file)
@@ -89,12 +89,18 @@ THIS SOFTWARE.
  * #define IBM for IBM mainframe-style floating-point arithmetic.
  * #define VAX for VAX-style floating-point arithmetic (D_floating).
  * #define No_leftright to omit left-right logic in fast floating-point
- *     computation of dtoa.
+ *     computation of dtoa and gdtoa.  This will cause modes 4 and 5 to be
+ *     treated the same as modes 2 and 3 for some inputs.
  * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
  * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
  *     that use extended-precision instructions to compute rounded
  *     products and quotients) with IBM.
- * #define ROUND_BIASED for IEEE-format with biased rounding.
+ * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
+ *     that rounds toward +Infinity.
+ * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
+ *     rounding when the underlying floating-point arithmetic uses
+ *     unbiased rounding.  This prevent using ordinary floating-point
+ *     arithmetic when the result could be computed with one rounding error.
  * #define Inaccurate_Divide for IEEE-format with correctly rounded
  *     products but inaccurate quotients, e.g., for Intel i860.
  * #define NO_LONG_LONG on machines that do not have a "long long"
@@ -391,6 +397,11 @@ typedef union { double d; ULong L[2]; } U;
 
 #ifndef IEEE_Arith
 #define ROUND_BIASED
+#else
+#ifdef ROUND_BIASED_without_Round_Up
+#undef  ROUND_BIASED
+#define ROUND_BIASED
+#endif
 #endif
 
 #ifdef RND_PRODQUOT
index 9783371..6adef8b 100644 (file)
@@ -363,6 +363,7 @@ strtod
                        ) {
                if (!e)
                        goto ret;
+#ifndef ROUND_BIASED_without_Round_Up
                if (e > 0) {
                        if (e <= Ten_pmax) {
 #ifdef VAX
@@ -423,6 +424,7 @@ strtod
                        goto ret;
                        }
 #endif
+#endif /* ROUND_BIASED_without_Round_Up */
                }
        e1 += nd - k;