mpq_get_d() rounding for different platforms?

Paul Zimmermann Paul.Zimmermann at
Tue Mar 17 08:07:17 CET 2009

       Dear Kish,

> I am trying to port our system (the constraint logic programming 
> platform ECLiPSe) to 64 bit x86-64 Windows, using MinGW-W64. Our system 
> uses GMP to implement large integers and rationals, and I have run into 
> some issues with rounding of rationals to double (using mpq_get_d()).
> I am using GMP 4.2.2, because I believe is the GMP version used by 
> MinGW-W64 itself. The issue I have ran into is that in some cases, the 
> MinGW-W64 version of GMP returns a slightly different double from the 32 
> bit Linux version of the same GMP. For example, for the rational 4/5,
> the MinGW version returns 0.79999999999999993, while the Linux version 
> returns 0.80000000000000004.

clearly the Linux version is wrong according to the GMP manual:

 -- Function: double mpq_get_d (mpq_t OP)
     Convert OP to a `double', truncating if necessary (ie. rounding
     towards zero).

> Looking at the manual, it seems that from GMP 4.2 onwards, mpq_get_d() 
> should round towards zero, and this suggest to me that 
> 0.79999999999999993 should be returned, for both platforms (they have 
> the same representation for double, I believe). Should the two platforms 
> return different values, and is there anyway I can get them to return 
> the same value on platforms with the same double representation?
> Thanks in advance for any information!
> Kish Shen

another possibility for you is to use the mpfr_set_q function from MPFR:

 -- Function: int mpfr_set_q (mpfr_t ROP, mpq_t OP, mp_rnd_t RND)

With rounding to zero, you will get 0.79999999999999993 on any platform,
and with rounding to +Infinity, you will get 0.80000000000000004.

Paul Zimmermann

More information about the gmp-discuss mailing list