[Python-checkins] r82087 - python/branches/py3k-dtoa/Python/dtoa.c
mark.dickinson
python-checkins at python.org
Sat Jun 19 12:15:27 CEST 2010
Author: mark.dickinson
Date: Sat Jun 19 12:15:27 2010
New Revision: 82087
Log:
Simplify ratio function, and allow the numerator of the ratio function to be zero.
Modified:
python/branches/py3k-dtoa/Python/dtoa.c
Modified: python/branches/py3k-dtoa/Python/dtoa.c
==============================================================================
--- python/branches/py3k-dtoa/Python/dtoa.c (original)
+++ python/branches/py3k-dtoa/Python/dtoa.c Sat Jun 19 12:15:27 2010
@@ -985,41 +985,19 @@
return dval(&u);
}
-/* Convert a Bigint to a double plus an exponent */
+/* Convert a Bigint a to a double giving the value a / 2**(32 * a->wds).
+ Error < 0.75 ulps. This function is currently used only by ratio. */
static double
-b2d(Bigint *a, int *e)
+b2d(Bigint *a)
{
- ULong *xa, *xa0, w, y, z;
- int k;
- U d;
-
- xa0 = a->x;
- xa = xa0 + a->wds;
- y = *--xa;
-#ifdef DEBUG
- if (!y) Bug("zero y in b2d");
-#endif
- k = hi0bits(y);
- *e = 32 - k;
- if (k < Ebits) {
- word0(&d) = Exp_1 | y >> (Ebits - k);
- w = xa > xa0 ? *--xa : 0;
- word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k);
- goto ret_d;
- }
- z = xa > xa0 ? *--xa : 0;
- if (k -= Ebits) {
- word0(&d) = Exp_1 | y << k | z >> (32 - k);
- y = xa > xa0 ? *--xa : 0;
- word1(&d) = z << k | y >> (32 - k);
- }
- else {
- word0(&d) = Exp_1 | y;
- word1(&d) = z;
- }
- ret_d:
- return dval(&d);
+ int i, wds;
+ double d;
+ wds = a->wds;
+ d = 0.0;
+ for (i = wds > 3 ? wds - 3 : 0; i < wds; i++)
+ d = (d + a->x[i]) * (1.0 / 4294967296.0);
+ return d;
}
/* Convert a scaled double to a Bigint plus an exponent. Similar to d2b,
@@ -1147,23 +1125,26 @@
}
/* Compute the ratio of two Bigints, as a double. The result may have an
- error of up to 2.5 ulps. */
+ error of up to 3.5 ulps. */
static double
ratio(Bigint *a, Bigint *b)
{
U da, db;
- int k, ka, kb;
+ int k;
- dval(&da) = b2d(a, &ka);
- dval(&db) = b2d(b, &kb);
- k = ka - kb + 32*(a->wds - b->wds);
- if (k > 0)
- word0(&da) += k*Exp_msk1;
- else {
- k = -k;
- word0(&db) += k*Exp_msk1;
- }
+#ifdef DEBUG
+ if (!b->x[0] && b->wds == 1)
+ Bug("zero divisor in ratio");
+#endif
+
+ dval(&da) = b2d(a);
+ dval(&db) = b2d(b);
+ k = a->wds - b->wds;
+ if (k >= 0)
+ word0(&da) += 32*Exp_msk1*k;
+ else
+ word0(&db) += 32*Exp_msk1*-k;
return dval(&da) / dval(&db);
}
More information about the Python-checkins
mailing list