Back to index

glibc  2.9
Functions
gmp.h File Reference
#include <gmp-mparam.h>
#include <stdlib/gmp.h>

Go to the source code of this file.

Functions

mp_size_t __mpn_extract_double (mp_ptr res_ptr, mp_size_t size, int *expt, int *is_neg, double value)
mp_size_t __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size, int *expt, int *is_neg, long double value)
float __mpn_construct_float (mp_srcptr frac_ptr, int expt, int sign)
double __mpn_construct_double (mp_srcptr frac_ptr, int expt, int negative)
long double __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign)

Function Documentation

double __mpn_construct_double ( mp_srcptr  frac_ptr,
int  expt,
int  negative 
)

Definition at line 27 of file mpn2dbl.c.

{
#error "__mpn_construct_double not implemented for this floating point format"
}
float __mpn_construct_float ( mp_srcptr  frac_ptr,
int  expt,
int  sign 
)

Definition at line 27 of file mpn2flt.c.

{
#error "__mpn_construct_float not implemented for this floating point format"
}
long double __mpn_construct_long_double ( mp_srcptr  frac_ptr,
int  expt,
int  sign 
)

Definition at line 31 of file mpn2ldbl.c.

{
  union ieee854_long_double u;

  u.ieee.negative = sign;
  u.ieee.exponent = expt + IEEE854_LONG_DOUBLE_BIAS;
#if BITS_PER_MP_LIMB == 32
  u.ieee.mantissa3 = frac_ptr[0];
  u.ieee.mantissa2 = frac_ptr[1];
  u.ieee.mantissa1 = frac_ptr[2];
  u.ieee.mantissa0 = frac_ptr[3] & (((mp_limb_t) 1
                                 << (LDBL_MANT_DIG - 96)) - 1);
#elif BITS_PER_MP_LIMB == 64
  u.ieee.mantissa3 = frac_ptr[0] & (((mp_limb_t) 1 << 32) - 1);
  u.ieee.mantissa2 = frac_ptr[0] >> 32;
  u.ieee.mantissa1 = frac_ptr[1] & (((mp_limb_t) 1 << 32) - 1);
  u.ieee.mantissa0 = (frac_ptr[1] >> 32) & (((mp_limb_t) 1
                                        << (LDBL_MANT_DIG - 96)) - 1);
#else
  #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
#endif

  return u.d;
}
mp_size_t __mpn_extract_double ( mp_ptr  res_ptr,
mp_size_t  size,
int expt,
int is_neg,
double  value 
)

Definition at line 27 of file dbl2mpn.c.

{
#error "__mpn_extract_double is not implemented for this floating point format"
}

Here is the caller graph for this function:

mp_size_t __mpn_extract_long_double ( mp_ptr  res_ptr,
mp_size_t  size,
int expt,
int is_neg,
long double  value 
)

Definition at line 32 of file ldbl2mpn.c.

{
  union ieee854_long_double u;
  u.d = value;

  *is_neg = u.ieee.negative;
  *expt = (int) u.ieee.exponent - IEEE854_LONG_DOUBLE_BIAS;

#if BITS_PER_MP_LIMB == 32
  res_ptr[0] = u.ieee.mantissa1; /* Low-order 32 bits of fraction.  */
  res_ptr[1] = u.ieee.mantissa0; /* High-order 32 bits.  */
  #define N 2
#elif BITS_PER_MP_LIMB == 64
  /* Hopefully the compiler will combine the two bitfield extracts
     and this composition into just the original quadword extract.  */
  res_ptr[0] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
  #define N 1
#else
  #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
#endif

  if (u.ieee.exponent == 0)
    {
      /* A biased exponent of zero is a special case.
        Either it is a zero or it is a denormal number.  */
      if (res_ptr[0] == 0 && res_ptr[N - 1] == 0) /* Assumes N<=2.  */
       /* It's zero.  */
       *expt = 0;
      else
       {
         /* It is a denormal number, meaning it has no implicit leading
            one bit, and its exponent is in fact the format minimum.  */
         int cnt;

         /* One problem with Intel's 80-bit format is that the explicit
            leading one in the normalized representation has to be zero
            for denormalized number.  If it is one, the number is according
            to Intel's specification an invalid number.  We make the
            representation unique by explicitly clearing this bit.  */
         res_ptr[N - 1] &= ~(1L << ((LDBL_MANT_DIG - 1) % BITS_PER_MP_LIMB));

         if (res_ptr[N - 1] != 0)
           {
             count_leading_zeros (cnt, res_ptr[N - 1]);
             if (cnt != 0)
              {
#if N == 2
                res_ptr[N - 1] = res_ptr[N - 1] << cnt
                               | (res_ptr[0] >> (BITS_PER_MP_LIMB - cnt));
                res_ptr[0] <<= cnt;
#else
                res_ptr[N - 1] <<= cnt;
#endif
              }
             *expt = LDBL_MIN_EXP - 1 - cnt;
           }
         else if (res_ptr[0] != 0)
           {
             count_leading_zeros (cnt, res_ptr[0]);
             res_ptr[N - 1] = res_ptr[0] << cnt;
             res_ptr[0] = 0;
             *expt = LDBL_MIN_EXP - 1 - BITS_PER_MP_LIMB - cnt;
           }
         else
           {
             /* This is the special case of the pseudo denormal number
               with only the implicit leading bit set.  The value is
               in fact a normal number and so we have to treat this
               case differently.  */
#if N == 2
             res_ptr[N - 1] = 0x80000000ul;
#else
             res_ptr[0] = 0x8000000000000000ul;
#endif
             *expt = LDBL_MIN_EXP - 1;
           }
       }
    }
  else if (u.ieee.exponent < 0x7fff
#if N == 2
          && res_ptr[0] == 0
#endif
          && res_ptr[N - 1] == 0)
    /* Pseudo zero.  */
    *expt = 0;

  return N;
}

Here is the caller graph for this function: