Back to index

glibc  2.9
Functions
s_roundl.c File Reference
#include <math.h>
#include <math_ldbl_opt.h>
#include <float.h>
#include <ieee754.h>

Go to the source code of this file.

Functions

long double __roundl (long double x)
 long_double_symbol (libm, __roundl, roundl)

Function Documentation

long double __roundl ( long double  x)

Definition at line 35 of file s_roundl.c.

{
  double xh, xl, hi, lo;

  ldbl_unpack (x, &xh, &xl);

  /* Return Inf, Nan, +/-0 unchanged.  */
  if (__builtin_expect (xh != 0.0
                     && __builtin_isless (__builtin_fabs (xh),
                                        __builtin_inf ()), 1))
    {
      double orig_xh;

      /* Long double arithmetic, including the canonicalisation below,
        only works in round-to-nearest mode.  */

      /* Convert the high double to integer.  */
      orig_xh = xh;
      hi = ldbl_nearbyint (xh);

      /* Subtract integral high part from the value.  */
      xh -= hi;
      ldbl_canonicalize (&xh, &xl);

      /* Now convert the low double, adjusted for any remainder from the
        high double.  */
      lo = ldbl_nearbyint (xh);

      /* Adjust the result when the remainder is exactly 0.5.  nearbyint
        rounds values halfway between integers to the nearest even
        integer.  roundl must round away from zero.
        Also correct cases where nearbyint returns an incorrect value
        for LO.  */
      xh -= lo;
      ldbl_canonicalize (&xh, &xl);
      if (xh == 0.5)
       {
         if (xl > 0.0 || (xl == 0.0 && orig_xh > 0.0))
           lo += 1.0;
       }
      else if (-xh == 0.5)
       {
         if (xl < 0.0 || (xl == 0.0 && orig_xh < 0.0))
           lo -= 1.0;
       }

      /* Ensure the final value is canonical.  In certain cases,
        rounding causes hi,lo calculated so far to be non-canonical.  */
      xh = hi;
      xl = lo;
      ldbl_canonicalize (&xh, &xl);
    }

  return ldbl_pack (xh, xl);
}

Here is the call graph for this function:

long_double_symbol ( libm  ,
__roundl  ,
roundl   
)