return b;
}
-static Bigint *
-s2b(const char *s, int nd0, int nd, unsigned int y9)
-{
- Bigint * b;
- int i, k;
- int x, y;
-
- x = (nd + 8) / 9;
- for (k = 0, y = 1; x > y; y <<= 1, k++)
- ;
- b = Balloc(k);
- b->x[0] = y9;
- b->wds = 1;
-
- i = 9;
- if (9 < nd0) {
- s += 9;
- do
- b = multadd(b, 10, *s++ - '0');
- while (++i < nd0);
- s++;
- } else
- s += 10;
- for (; i < nd; i++)
- b = multadd(b, 10, *s++ - '0');
- return b;
-}
-
static int
hi0bits(register unsigned int x)
{
return c;
}
-static double
-ulp(FPdbleword x)
-{
- int L;
- FPdbleword a;
-
- L = (fpword0(x) & Exp_mask) - (P - 1) * Exp_msk1;
- fpword0(a) = L;
- fpword1(a) = 0;
- return a.x;
-}
-
static FPdbleword
b2d(Bigint *a, int *e)
{
#undef d0
#undef d1
-static double
-ratio(Bigint *a, Bigint *b)
-{
- FPdbleword da, db;
- int k, ka, kb;
-
- da = b2d(a, &ka);
- db = b2d(b, &kb);
- k = ka - kb + 32 * (a->wds - b->wds);
- if (k > 0)
- fpword0(da) += k * Exp_msk1;
- else {
- k = -k;
- fpword0(db) += k * Exp_msk1;
- }
- return da.x / db.x;
-}
-
static const double
tens[] = {
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
bigtens[] = {
1e16, 1e32, 1e64, 1e128, 1e256 };
-static const double tinytens[] = {
- 1e-16, 1e-32, 1e-64, 1e-128,
- 9007199254740992.e-256
-};
-
/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
/* flag unnecessarily. It leads to a song and dance at the end of strtod. */
#define Scale_Bit 0x10
#define NAN_WORD1 0
-static int
-match(const char **sp, char *t)
-{
- int c, d;
- const char * s = *sp;
-
- while (d = *t++) {
- if ((c = *++s) >= 'A' && c <= 'Z')
- c += 'a' - 'A';
- if (c != d)
- return 0;
- }
- *sp = s + 1;
- return 1;
-}
-
-static void
-gethex(FPdbleword *rvp, const char **sp)
-{
- unsigned int c, x[2];
- const char * s;
- int havedig, udx0, xshift;
-
- x[0] = x[1] = 0;
- havedig = xshift = 0;
- udx0 = 1;
- s = *sp;
- while (c = *(const unsigned char * )++s) {
- if (c >= '0' && c <= '9')
- c -= '0';
- else if (c >= 'a' && c <= 'f')
- c += 10 - 'a';
- else if (c >= 'A' && c <= 'F')
- c += 10 - 'A';
- else if (c <= ' ') {
- if (udx0 && havedig) {
- udx0 = 0;
- xshift = 1;
- }
- continue;
- } else if (/*(*/ c == ')') {
- *sp = s + 1;
- break;
- } else
- return; /* invalid form: don't change *sp */
- havedig = 1;
- if (xshift) {
- xshift = 0;
- x[0] = x[1];
- x[1] = 0;
- }
- if (udx0)
- x[0] = (x[0] << 4) | (x[1] >> 28);
- x[1] = (x[1] << 4) | c;
- }
- if ((x[0] &= 0xfffff) || x[1]) {
- fpword0(*rvp) = Exp_mask | x[0];
- fpword1(*rvp) = x[1];
- }
-}
-
static int
quorem(Bigint *b, Bigint *S)
{