Back to index

glibc  2.9
Functions
s_llrint.c File Reference
#include <math.h>
#include "math_private.h"
#include "mathimpl.h"

Go to the source code of this file.

Functions

long long int __llrint (double x)

Function Documentation

long long int __llrint ( double  x)

Definition at line 27 of file s_llrint.c.

{
  int32_t e;
  u_int32_t h, l, s;
  long long int result;

  x = __m81_u(__rint) (x);

  /* We could use __fixxfdi from libgcc, but here we can take advantage of
     the known floating point format.  */
  EXTRACT_WORDS (h, l, x);

  e = ((h >> 20) & 0x7ff) - 0x3ff;
  if (e < 0)
    return 0;
  s = h;
  h &= 0xfffff;
  h |= 0x100000;

  if (e < 63)
    {
      if (e > 52)
       {
         h <<= e - 52;
         h |= l >> (84 - e);
         l <<= e - 52;
         result = ((long long int) h << 32) | l;
       }
      else if (e > 20)
       {
         l >>= 52 - e;
         l |= h << (e - 20);
         h >>= 52 - e;
         result = ((long long int) h << 32) | l;
       }
      else
       result = h >> (20 - e);
      if (s & 0x80000000)
       result = -result;
    }
  else
    /* The number is too large or not finite.  The standard leaves it
       undefined what to return when the number is too large to fit in a
       `long long int'.  */
    result = -1LL;

  return result;
}

Here is the call graph for this function: