get_string limitation to 32 bit number.

Sergio Abreu dosergio at
Sun Dec 12 15:12:14 CET 2010

GMP in use: 5.0.1
I tried to compile it as static and dynamic but the bug persists.
What is wrong:
If the value of mpf_t is less than 2^32 the function mpf_get_str works 
fine. Otherwhise, you loose the upper 32 bits and the function only 
returns the number corresponding to the lowest 32 bits.
Version of gcc and g++, both 4.5.0
./config.guess = athlon64-pc-mingw32
./configfsf.guess = i686-pc-mingw32
uname -a = MINGW32_NT-5.1 MYCOMPUTERNAME 1.0.16/(0.48/3/2) DATE HOUR 
i686 Msys

Source code for testing:

// ------ BEGIN SOURCE -------------

 * File:   main.cpp
 * Author: Sergio Abreu
 * Created on 2010, Dezember 10th, 12:24

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
int main(int argc, char** argv) {

    mpz_t a;
    mpf_t x, y, z;
    mp_exp_t exp;
    char *c;
    double d;
    unsigned long long ul;
  /* You can run the program with one argument in the command line: Ex: 
gmptest 33,
     or change the 31 below to 32 or bigger and recompile,
     to see the problem with no arguments in the command line. In this case,
     to see the correct behavior you must supply a less than 32 argument 
Ex gmptest 31 or less.

    int power = argc > 1 ? atoi(argv[1]) : 31; 


    mpz_set_ui( a, 2 );
    mpf_set_ui( x, 2 );
    mpf_set_ui( y, 2 );
    mpz_pow_ui( a, a, power);

    gmp_printf("Initial value: %Zd, power in test is %d\n",  a, power );

    ul = 137;
    mpz_add_ui( a, a, ul);
    gmp_printf("After sum: %Zd \n", a );

    ul = mpz_get_ui( a);
    mpf_set_ui( x, ul);

    c = mpf_get_str( NULL, &exp, 2, 0, x);
    printf("Bits representing mpf_t x value: %s exp= %lu\n", c, exp);

    mpf_div(z, x, y);
    gmp_printf ("Result: %1.1Ff divided by  %1.1Ff is %1.1Ff\n", x , y , 
z );


    return 0;

// ------- END OF SOURCE

More information about the gmp-bugs mailing list