Wouldn't that break mpz_sgn(v) if i use mpz_set_str(v, "00000000000000000000000000000000000000000000", 10) ?
mpn_set_str_other would then return a value greater than zero for v, even if the value is zero. Thus v->_mp_size would be greater than zero: 4179 rn = mpn_set_str_other (rp, dp, sn, base, &info); 4180 } 4181 assert (rn <= alloc); 4182 gmp_free (dp); 4183 4184 r->_mp_size = sign ? - rn : rn; As a consequence, mpz_sgn(v) would return 1. Kind regards Axel Von: Austyn Krutsinger <[email protected]> An: Torbjörn Granlund <[email protected]> Kopie: Axel Miller <[email protected]>, [email protected] Datum: 21.07.2016 10:53 Betreff: Re: mini-gmp: mpz_init_set_str fails on leading zeroes On Thu, Jul 21, 2016 at 1:43 AM, Torbjörn Granlund <[email protected]> wrote: Austyn Krutsinger <[email protected]> writes: My initial though was to just skip the leading zero's in the mpz_set_str function by something like this: while (isspace( (unsigned char) *sp) || (*sp == '0')) sp++; Only problems is that this doesn't work for negative numbers that still have a bunch of leading zeros; I think we should not accept strings like 00000-0000017. Absolutely agree with you, kind of a silly proposal in retrospect. We can fix this in the mpn_set_str_other function by changing the comparison in line 1321. If we accept that w can be > or = to 0, then there is no issue if the number has leading zeros. So line 1321 in mpn_set_str_other becomes: 1321 for (rn = (w >= 0); j < sn;) 1322 { 1323 mp_limb_t cy; 1324 1325 w = sp[j++]; 1326 for (k = 1; k < info->exp; k++) 1327 w = w * b + sp[j++]; 1328 1329 cy = mpn_mul_1 (rp, rp, rn, info->bb); 1330 cy += mpn_add_1 (rp, rp, rn, w); 1331 if (cy > 0) 1332 rp[rn++] = cy; 1333 } 1334 assert (j == sn); 1321 for (rn = (w > 0); j < sn;) Regards, Austyn _______________________________________________ gmp-bugs mailing list [email protected] https://gmplib.org/mailman/listinfo/gmp-bugs
