mpz_get_d precision

Torbjorn Granlund tege at swox.com
Fri Feb 18 22:41:49 CET 2005


Roberto Bagnara <bagnara at cs.unipr.it> writes:

  Kevin Ryde wrote:
  > Updated words on the get_d functions will be as follows.
  > The bits about hardware traps are because I don't want to try to
  > guarantee they will or won't occur.  I'm fairly sure in the past some
  > cases trapped and some not, so this should be a no-change.
  >  -- Function: double mpz_get_d (mpz_t OP)
  >      Convert OP to a `double', truncating if necessary (ie. rounding
  >      towards zero).
  >      If the exponent from the conversion is too big, the result is
  >      system dependent.  An infinity is returned where available.  A
  >      hardware overflow trap may or may not occur.
  >  -- Function: double mpz_get_d_2exp (signed long int *EXP, mpz_t OP)
  >      Convert OP to a `double', truncating if necessary (ie. rounding
  >      towards zero), and returning the exponent separately.
  >      The return value is in the range 0.5<=abs(D)<1 and the exponent is
  >      stored to `*EXP'.  D * 2^EXP is the (truncated) OP value.  If OP
  >      is zero, the return is 0.0 and 0 is stored to `*EXP'.
  >      This is similar to the standard C `frexp' function (*note
  >      Normalization Functions: (libc)Normalization Functions.).
  >  -- Function: double mpq_get_d (mpq_t OP)
  >      Convert OP to a `double', truncating if necessary (ie. rounding
  >      towards zero).
  >      If the exponent from the conversion is too big or too small to fit
  >      a `double' then the result is system dependent.  For too big an
  >      infinity is returned when available.  For too small 0.0 is
  >      returned.  Hardware overflow, underflow and denorm traps may or
  >      may not occur.
  >  -- Function: double mpf_get_d (mpf_t OP)
  >      Convert OP to a `double', truncating if necessary (ie. rounding
  >      towards zero).
  >      If the exponent in OP is too big or too small to fit a `double'
  >      then the result is system dependent.  For too big an infinity is
  >      returned when available.  For too small 0.0 is returned.  Hardware
  >      overflow, underflow and denorm traps may or may not occur.
  >  -- Function: double mpf_get_d_2exp (signed long int *EXP, mpf_t OP)
  >      Convert OP to a `double', truncating if necessary (ie. rounding
  >      towards zero), and with an exponent returned separately.
  >      The return value is in the range 0.5<=abs(D)<1 and the exponent is
  >      stored to `*EXP'.  D * 2^EXP is the (truncated) OP value.  If OP
  >      is zero, the return is 0.0 and 0 is stored to `*EXP'.
  >      This is similar to the standard C `frexp' function (*note
  >      Normalization Functions: (libc)Normalization Functions.).
  
  I see this extra documentation is not present in the GMP 4.1.4 distribution.
  Since I am very interested about these guarantees (in particular
  for what concerns mpz_get_d and mpq_get_d), I would like to ask:
  
  1) Do these words apply to GMP 4.1.4?

I don't know.  Probably not.

  2) (In any case) Will they apply to GMP 4.2?
  
Yes.

-- 
Torbjörn


More information about the gmp-devel mailing list