41 unsigned long carry, q, ys;
42 unsigned long *bx, *bxe, *sx, *sxe;
51 Bug (
"oversize b in quorem");
59 q = *bxe / (*sxe + 1);
62 Bug (
"oversized quotient in quorem");
72 ys = (si & 0xffff) * q + carry;
73 zs = (si >> 16) * q + (ys >> 16);
75 y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
78 z = (*bx >> 16) - (zs & 0xffff) + borrow;
83 ys = *sx++ * q + carry;
85 y = *bx - (ys & 0xffff) + borrow;
95 while (--bxe > bx && !*bxe)
111 ys = (si & 0xffff) + carry;
112 zs = (si >> 16) + (ys >> 16);
114 y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
117 z = (*bx >> 16) - (zs & 0xffff) + borrow;
124 y = *bx - (ys & 0xffff) + borrow;
135 while (--bxe > bx && !*bxe)
157 fprintf (stderr,
"%08x", *x);
160 fprintf (stderr,
"\n");
202 **rve
_AND int float_type)
226 int bbits, b2, b5, be, dig,
i, ieps, ilim0, j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, try_quick;
227 int ilim = 0, ilim1 = 0, spec_case = 0;
230 #ifndef Sudden_Underflow 237 static char infinity_p[] =
"Infinity", NaN_p[] =
"NaN", zero_p[] =
"0";
244 ptr->_result->_k = ptr->_result_k;
245 ptr->_result->_maxwds = 1 << ptr->_result_k;
246 Bfree (ptr, ptr->_result);
254 word0 (d) &= ~Sign_bit;
259 #if defined(IEEE_Arith) + defined(VAX) 263 if (
word0 (d) == 0x8000)
270 !
word1 (d) && !(
word0 (d) & 0xfffff) ? infinity_p :
294 b =
d2b (ptr, d.
d, &be, &bbits);
295 #ifdef Sudden_Underflow 323 #ifndef Sudden_Underflow 330 i = bbits + be + (
Bias + (
PREC - 1) - 1);
331 x = i > 32 ?
word0 (d) << (64 -
i) |
word1 (d) >> (i - 32) :
word1 (d) << (32 -
i);
338 ds = (d2.
d - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981;
340 if (ds < 0. && ds != k)
372 if (mode < 0 || mode > 9)
395 ilim = ilim1 = i = ndigits;
407 j =
sizeof (
unsigned long);
408 for (ptr->_result_k = 0; (
int) (
sizeof (
_Jv_Bigint) -
sizeof (
unsigned long)) + j <= i; j <<= 1)
410 ptr->_result =
Balloc (ptr, ptr->_result_k);
411 s = s0 = (
char *) ptr->_result;
433 for (; j; j >>= 1, i++)
443 d.
d *=
tens[j1 & 0xf];
444 for (j = j1 >> 4; j; j >>= 1, i++)
451 if (k_check && d.
d < 1. && ilim > 0)
460 eps.
d = ieps * d.
d + 7.;
476 eps.
d = 0.5 /
tens[ilim - 1] - eps.
d;
481 *s++ =
'0' + (
int) L;
484 if (1. - d.
d < eps.
d)
496 eps.
d *=
tens[ilim - 1];
497 for (i = 1;; i++, d.
d *= 10.)
501 *s++ =
'0' + (
int) L;
504 if (d.
d > 0.5 + eps.
d)
506 else if (d.
d < 0.5 - eps.
d)
531 if (ndigits < 0 && ilim <= 0)
534 if (ilim < 0 || d.
d <= 5 * ds)
540 L = (long) (d.
d / ds);
542 #ifdef Check_FLT_ROUNDS 550 *s++ =
'0' + (int) L;
554 if (d.
d > ds || (d.
d == ds && L & 1))
582 #ifndef Sudden_Underflow 583 denorm ? be + (
Bias + (
PREC - 1) - 1 + 1) :
586 1 + 4 *
PREC - 3 - bbits + ((bbits + be - 1) & 3);
612 if (m2 > 0 && s2 > 0)
614 i = m2 < s2 ? m2 : s2;
626 b1 =
mult (ptr, mhi, b);
646 &&
word0 (d) & Exp_mask
664 if ((i = ((s5 ? 32 -
hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0x1f))
667 if ((i = ((s5 ? 32 -
hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0xf))
695 mhi =
multadd (ptr, mhi, 10, 0);
699 if (ilim <= 0 && mode > 2)
701 if (ilim < 0 ||
cmp (b, S =
multadd (ptr, S, 5, 0)) <= 0)
716 mhi =
lshift (ptr, mhi, m2);
720 mhi =
lshift (ptr, mhi, 29);
727 mhi =
Balloc (ptr, mhi->_k);
734 dig = quorem (b, S) +
'0';
737 delta =
diff (ptr, S, mhi);
738 j1 = delta->
_sign ? 1 :
cmp (b, delta);
741 if (j1 == 0 && !
mode && !(
word1 (d) & 1))
751 if (j < 0 || (j == 0 && !
mode 761 if ((j1 > 0 || (j1 == 0 && dig & 1)) && dig++ ==
'9')
783 mlo = mhi =
multadd (ptr, mhi, 10, 0);
786 mlo =
multadd (ptr, mlo, 10, 0);
787 mhi =
multadd (ptr, mhi, 10, 0);
794 *s++ = dig = quorem (b, S) +
'0';
804 if (j > 0 || (j == 0 && dig & 1))
825 if (mlo && mlo != mhi)
859 memset (&reent, 0,
sizeof reent);
861 p =
_dtoa_r (&reent, _d,
mode, ndigits, decpt, sign, rve, float_type);
864 for (i = 0; i < reent.
_max_k; ++
i)
#define Sign_Extend(a, b)
static int roundoff(const INTL_LANG lang, char *src_string, int flag, int *cipher, char *format)
struct _Jv_Bigint _Jv_Bigint
struct _Jv_Bigint ** _freelist
static int _DEFUN(quorem,(b, S), _Jv_Bigint *b _AND _Jv_Bigint *S)
static enum scanner_mode mode
void free_Bigints(struct _Jv_Bigint *p)
struct _Jv_Bigint * _next
#define Storeinc(a, b, c)
struct _Jv_Bigint * _result