Limitation of the mpz_get_str function

Christophe Clavier christophe.clavier at
Tue Feb 16 13:22:20 UTC 2021

Dear GMP developers,

I currently have to deal with huge numbers (several billions decimal 
digits) which I need to convert in strings of digits with mpz_get_str.
I noticed that this function produces an incorrect result when the 
number of digits exceeds 2^31.
The reason lies in the loop that scans the buffer computed by 
mpn_get_str and transforms each digit from an integer to an ascii code :

   for (i = 0; i < str_size; i++)
     res_str[i] = num_to_text[(int) res_str[i]];
   res_str[str_size] = 0;

As i is of type int, when it is incremented from 2^31-1 to 2^31 it 
becomes negative.
For the comparison with str_size, which is of type size_t (i.e. unsigned 
long int), i is casted in unsigned long int and becomes a large positive 
value near 2^64.
Thus the comparison is evaluated to false and the loop early terminates.

I suggest to modify the type of i to long int or to unsigned long int.



More information about the gmp-bugs mailing list