static void dump (const char *label, const mpz_t x) { char *buf = mpz_get_str (NULL, 16, x); fprintf (stderr, "%s: %s\n", label, buf); testfree (buf); }
main() { char *s1,*s2,*s3,*s4,*s5,*s6; unsigned size; s1 = testalloc(1); s2 = testalloc(2); s3 = testalloc(0x10); s4 = testalloc(0x100); s5 = testalloc(0x1000); s6 = testalloc(0xfff0); testfree(s3); s3 = testalloc(6); testfree(s2); testalloc(8); #ifdef __GNUC__ for(size = 0xe0000000; size;) #else for(size = 0xe000; size;) #endif { if (testalloc(size)) ; else size >>= 1; } testfree(s1); testfree(s5); testfree(s4); testfree(s6); return 1; }
void testmain (int argc, char **argv) { unsigned i; mpz_t x; for (i = 0; values[i].s; i++) { char *s; mpz_init_set_d (x, values[i].d); s = mpz_get_str (NULL, 16, x); if (strcmp (s, values[i].s) != 0) { fprintf (stderr, "mpz_set_d failed:\n" "d = %.20g\n" "s = %s\n" "r = %s\n", values[i].d, s, values[i].s); abort (); } testfree (s); mpz_clear (x); } mpz_init (x); for (i = 0; i < COUNT; i++) { /* Use volatile, to avoid extended precision in floating point registers, e.g., on m68k and 80387. */ volatile double d, f; unsigned long m; int e; mini_rrandomb (x, GMP_LIMB_BITS); m = mpz_get_ui (x); mini_urandomb (x, 8); e = mpz_get_ui (x) - 100; d = ldexp ((double) m, e); mpz_set_d (x, d); f = mpz_get_d (x); if (f != floor (d)) { fprintf (stderr, "mpz_set_d/mpz_get_d failed:\n"); goto dumperror; } if ((f == d) ? (mpz_cmp_d (x, d) != 0) : (mpz_cmp_d (x, d) >= 0)) { fprintf (stderr, "mpz_cmp_d (x, d) failed:\n"); goto dumperror; } f = d + 1.0; if (f > d && ! (mpz_cmp_d (x, f) < 0)) { fprintf (stderr, "mpz_cmp_d (x, f) failed:\n"); goto dumperror; } d = - d; mpz_set_d (x, d); f = mpz_get_d (x); if (f != ceil (d)) { fprintf (stderr, "mpz_set_d/mpz_get_d failed:\n"); dumperror: dump ("x", x); fprintf (stderr, "m = %lx, e = %i\n", m, e); fprintf (stderr, "d = %.15g\n", d); fprintf (stderr, "f = %.15g\n", f); fprintf (stderr, "f - d = %.5g\n", f - d); abort (); } if ((f == d) ? (mpz_cmp_d (x, d) != 0) : (mpz_cmp_d (x, d) <= 0)) { fprintf (stderr, "mpz_cmp_d (x, d) failed:\n"); goto dumperror; } f = d - 1.0; if (f < d && ! (mpz_cmp_d (x, f) > 0)) { fprintf (stderr, "mpz_cmp_d (x, f) failed:\n"); goto dumperror; } } mpz_clear (x); }
void testmain (int argc, char **argv) { unsigned i; char *ap; char *bp; char *rp; size_t bn, rn, arn; mpz_t a, b; FILE *tmp; test_small (); mpz_init (a); mpz_init (b); tmp = tmpfile (); if (!tmp) fprintf (stderr, "Failed to create temporary file. Skipping mpz_out_str tests.\n"); for (i = 0; i < COUNT; i++) { int base; for (base = 0; base <= 36; base += 1 + (base == 0)) { hex_random_str_op (MAXBITS, i&1 ? base: -base, &ap, &rp); if (mpz_set_str (a, ap, 16) != 0) { fprintf (stderr, "mpz_set_str failed on input %s\n", ap); abort (); } rn = strlen (rp); arn = rn - (rp[0] == '-'); bn = mpz_sizeinbase (a, base ? base : 10); if (bn < arn || bn > (arn + 1)) { fprintf (stderr, "mpz_sizeinbase failed:\n"); dump ("a", a); fprintf (stderr, "r = %s\n", rp); fprintf (stderr, " base %d, correct size %u, got %u\n", base, (unsigned) arn, (unsigned)bn); abort (); } bp = mpz_get_str (NULL, i&1 ? base: -base, a); if (strcmp (bp, rp)) { fprintf (stderr, "mpz_get_str failed:\n"); dump ("a", a); fprintf (stderr, "b = %s\n", bp); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", rp); abort (); } /* Just a few tests with file i/o. */ if (tmp && i < 20) { size_t tn; rewind (tmp); tn = mpz_out_str (tmp, i&1 ? base: -base, a); if (tn != rn) { fprintf (stderr, "mpz_out_str, bad return value:\n"); dump ("a", a); fprintf (stderr, "r = %s\n", rp); fprintf (stderr, " base %d, correct size %u, got %u\n", base, (unsigned) rn, (unsigned)tn); abort (); } rewind (tmp); memset (bp, 0, rn); tn = fread (bp, 1, rn, tmp); if (tn != rn) { fprintf (stderr, "fread failed, expected %lu bytes, got only %lu.\n", (unsigned long) rn, (unsigned long) tn); abort (); } if (memcmp (bp, rp, rn) != 0) { fprintf (stderr, "mpz_out_str failed:\n"); dump ("a", a); fprintf (stderr, "b = %s\n", bp); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", rp); abort (); } } mpz_set_str (b, rp, base); if (mpz_cmp (a, b)) { fprintf (stderr, "mpz_set_str failed:\n"); fprintf (stderr, "r = %s\n", rp); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", ap); fprintf (stderr, " base = 16\n"); dump ("b", b); dump ("r", a); abort (); } /* Test mpn interface */ if (base && mpz_sgn (a)) { size_t i; const char *absr; mp_limb_t t[MAXLIMBS]; mp_size_t tn = mpz_size (a); assert (tn <= MAXLIMBS); mpn_copyi (t, a->_mp_d, tn); bn = mpn_get_str ((unsigned char *) bp, base, t, tn); if (bn != arn) { fprintf (stderr, "mpn_get_str failed:\n"); fprintf (stderr, "returned length: %lu (bad)\n", (unsigned long) bn); fprintf (stderr, "expected: %lu\n", (unsigned long) arn); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", ap); fprintf (stderr, " base = 16\n"); dump ("b", b); dump ("r", a); abort (); } absr = rp + (rp[0] == '-'); for (i = 0; i < bn; i++) { unsigned char digit = absr[i]; unsigned value; if (digit >= '0' && digit <= '9') value = digit - '0'; else if (digit >= 'a' && digit <= 'z') value = digit - 'a' + 10; else if (digit >= 'A' && digit <= 'Z') value = digit - 'A' + 10; else { fprintf (stderr, "Internal error in test.\n"); abort(); } if (bp[i] != value) { fprintf (stderr, "mpn_get_str failed:\n"); fprintf (stderr, "digit %lu: %d (bad)\n", (unsigned long) i, bp[i]); fprintf (stderr, "expected: %d\n", value); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", ap); fprintf (stderr, " base = 16\n"); dump ("b", b); dump ("r", a); abort (); } } tn = mpn_set_str (t, (unsigned char *) bp, bn, base); if (tn != mpz_size (a) || mpn_cmp (t, a->_mp_d, tn)) { fprintf (stderr, "mpn_set_str failed:\n"); fprintf (stderr, "r = %s\n", rp); fprintf (stderr, " base = %d\n", base); fprintf (stderr, "r = %s\n", ap); fprintf (stderr, " base = 16\n"); dump ("r", a); abort (); } } free (ap); testfree (bp); } } mpz_clear (a); mpz_clear (b); }