Back to index

glibc  2.9
s_floorl.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.


long double __floorl (long double x)
 long_double_symbol (libm, __floorl, floorl)

Function Documentation

long double __floorl ( long double  x)

Definition at line 32 of file s_floorl.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))
      /* Long double arithmetic, including the canonicalisation below,
        only works in round-to-nearest mode.  */

      /* Convert the high double to integer.  */
      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 (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);

  return ldbl_pack (xh, xl);

Here is the call graph for this function:

long_double_symbol ( libm  ,
__floorl  ,