Back to index

glibc  2.9
Functions
s_truncl.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 __truncl (long double x)
 long_double_symbol (libm, __truncl, truncl)

Function Documentation

long double __truncl ( long double  x)

Definition at line 35 of file s_truncl.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 non-zero.  nearbyint
         rounds values to the nearest integer, and values halfway
         between integers to the nearest even integer.  floorl must
         round towards -Inf.  */
      xh -= lo;
      ldbl_canonicalize (&xh, &xl);

      if (orig_xh < 0.0)
       {
         if (xh > 0.0 || (xh == 0.0 && xl > 0.0))
           lo += 1.0;
       }
      else
       {
         if (xh < 0.0 || (xh == 0.0 && xl < 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);

      /* Ensure we return -0 rather than +0 when appropriate.  */
      if (orig_xh < 0.0)
       xh = -__builtin_fabs (xh);
    }

  return ldbl_pack (xh, xl);
}

Here is the call graph for this function:

long_double_symbol ( libm  ,
__truncl  ,
truncl   
)