mpf_get_str

Adam adammaj1 at o2.pl
Sun Oct 6 08:55:48 CEST 2013


Hi.
I try to convert decimal fration to binary using mpf_get_str .
Example input 1/6 should give 0.00101010101010101

How can I do that using gmp ?
Below is my program.
it gives :
101010101010101010101010101010101010101010101010101010101010101011
   exponent : -2

TIA

Adam

====

/*

C programme

gcc r.c -lgmp
./a.out

http://gmplib.org/manual/Rational-Number-Functions.html#Rational-Number-Functions

a rational number 1 / 6 is in a canonical form ( decimal fraction) : 1/6
  numerator of rational number = 1
  denominator of rational number = 6
   binary rational (  string ) : 1/110
   decimal floating point number : 0.166666666666666666667
   binary floating (  string ) : 
101010101010101010101010101010101010101010101010101010101010101011
   exponent : -2
f=101010101010101010101010101010101010101010101010101010101010101011f*2^-2

should be 0.0(01)

*/



#include <stdio.h>
#include <gmp.h>

// input = num/den
unsigned int num = 1;
unsigned int den = 6;

int main ()
{




         mpq_t q;   // rational number;
         int b =2 ; // base of numeral system
         mpz_t  n ;
         mpz_t  d ;
         mpf_t  f ;
         char  *sr;
         char  *sf;
         mp_exp_t exponent ; // holds the exponent for the result string

         // init and set variables
         mpq_init (q); // Initialize r and set it to 0/1.
         mpf_init (f);
         mpz_init_set_ui(n,num);
         mpz_init_set_ui(d,den);
         mpq_set_num(q,n);
         mpq_set_den(q,d);
         mpq_canonicalize (q); // It is the responsibility of the user 
to canonicalize the assigned variable before any arithmetic operations 
are performed on that variable.
         mpf_set_q(f,q);



         // convertions
         sr = mpq_get_str (NULL, b, q); // rational number = fraction : 
from decimal to binary
         // If str is NULL, the result string is allocated using the 
current allocation function
         sf = mpf_get_str (NULL, &exponent, b, 0, f); // floating point 
number : from decimal to binary
         //  If n_digits is 0 then that accurate maximum number of 
digits are generated.

         // print
         gmp_printf ("a rational number %Zd / %Zd is in a canonical form 
( decimal fraction) : %Qd\n",n,d, q); //
         gmp_printf(" numerator of rational number = %Zd \n", 
mpq_numref(q)); //
         gmp_printf(" denominator of rational number = %Zd \n", 
mpq_denref(q)); //
         gmp_printf ("  binary rational (  string ) : %s \n", sr); //
         gmp_printf ("  decimal floating point number : %.Ff \n", f); //
         gmp_printf ("  binary floating (  string ) : %s \n", sf); //
         gmp_printf ("  exponent : %ld \n", exponent); //
         printf ("f=%sf*%d^%ld\n", sf,b, exponent);


         // clear memory
         mpq_clear (q);
         mpz_clear (n);
         mpz_clear (d);
         mpf_clear (f);

         return 0;
}


More information about the gmp-discuss mailing list