Blame sysdeps/ieee754/dbl-64/s_ceil.c

Packit 6c4009
/* @(#)s_ceil.c 5.1 93/09/24 */
Packit 6c4009
/*
Packit 6c4009
 * ====================================================
Packit 6c4009
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Packit 6c4009
 *
Packit 6c4009
 * Developed at SunPro, a Sun Microsystems, Inc. business.
Packit 6c4009
 * Permission to use, copy, modify, and distribute this
Packit 6c4009
 * software is freely granted, provided that this notice
Packit 6c4009
 * is preserved.
Packit 6c4009
 * ====================================================
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * ceil(x)
Packit 6c4009
 * Return x rounded toward -inf to integral value
Packit 6c4009
 * Method:
Packit 6c4009
 *	Bit twiddling.
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
#include <math.h>
Packit 6c4009
#include <math_private.h>
Packit 6c4009
#include <libm-alias-double.h>
Packit 6c4009
Packit 6c4009
double
Packit 6c4009
__ceil (double x)
Packit 6c4009
{
Packit Service d45d03
  int64_t i0, i;
Packit Service d45d03
  int32_t j0;
Packit Service d45d03
  EXTRACT_WORDS64 (i0, x);
Packit Service d45d03
  j0 = ((i0 >> 52) & 0x7ff) - 0x3ff;
Packit Service d45d03
  if (j0 <= 51)
Packit 6c4009
    {
Packit 6c4009
      if (j0 < 0)
Packit 6c4009
	{
Packit Service d45d03
	  /* return 0 * sign(x) if |x| < 1  */
Packit 6c4009
	  if (i0 < 0)
Packit Service d45d03
	    i0 = INT64_C (0x8000000000000000);
Packit Service d45d03
	  else if (i0 != 0)
Packit Service d45d03
	    i0 = INT64_C (0x3ff0000000000000);
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	{
Packit Service d45d03
	  i = INT64_C (0x000fffffffffffff) >> j0;
Packit Service d45d03
	  if ((i0 & i) == 0)
Packit Service d45d03
	    return x;			/* x is integral  */
Packit 6c4009
	  if (i0 > 0)
Packit Service d45d03
	    i0 += UINT64_C (0x0010000000000000) >> j0;
Packit Service d45d03
	  i0 &= ~i;
Packit 6c4009
	}
Packit 6c4009
    }
Packit Service d45d03
  else
Packit 6c4009
    {
Packit 6c4009
      if (j0 == 0x400)
Packit Service d45d03
	return x + x;			/* inf or NaN  */
Packit 6c4009
      else
Packit Service d45d03
	return x;			/* x is integral  */
Packit 6c4009
    }
Packit Service d45d03
  INSERT_WORDS64 (x, i0);
Packit 6c4009
  return x;
Packit 6c4009
}
Packit 6c4009
#ifndef __ceil
Packit 6c4009
libm_alias_double (__ceil, ceil)
Packit 6c4009
#endif