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 8bbac7
  int32_t i0, i1, j0;
Packit Service 8bbac7
  uint32_t i, j;
Packit Service 8bbac7
  EXTRACT_WORDS (i0, i1, x);
Packit Service 8bbac7
  j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
Packit Service 8bbac7
  if (j0 < 20)
Packit 6c4009
    {
Packit 6c4009
      if (j0 < 0)
Packit 6c4009
	{
Packit Service 8bbac7
	  /* return 0*sign(x) if |x|<1 */
Packit 6c4009
	  if (i0 < 0)
Packit Service 8bbac7
	    {
Packit Service 8bbac7
	      i0 = 0x80000000; i1 = 0;
Packit Service 8bbac7
	    }
Packit Service 8bbac7
	  else if ((i0 | i1) != 0)
Packit Service 8bbac7
	    {
Packit Service 8bbac7
	      i0 = 0x3ff00000; i1 = 0;
Packit Service 8bbac7
	    }
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	{
Packit Service 8bbac7
	  i = (0x000fffff) >> j0;
Packit Service 8bbac7
	  if (((i0 & i) | i1) == 0)
Packit Service 8bbac7
	    return x;                        /* x is integral */
Packit 6c4009
	  if (i0 > 0)
Packit Service 8bbac7
	    i0 += (0x00100000) >> j0;
Packit Service 8bbac7
	  i0 &= (~i); i1 = 0;
Packit 6c4009
	}
Packit 6c4009
    }
Packit Service 8bbac7
  else if (j0 > 51)
Packit 6c4009
    {
Packit 6c4009
      if (j0 == 0x400)
Packit Service 8bbac7
	return x + x;                   /* inf or NaN */
Packit 6c4009
      else
Packit Service 8bbac7
	return x;                       /* x is integral */
Packit Service 8bbac7
    }
Packit Service 8bbac7
  else
Packit Service 8bbac7
    {
Packit Service 8bbac7
      i = ((uint32_t) (0xffffffff)) >> (j0 - 20);
Packit Service 8bbac7
      if ((i1 & i) == 0)
Packit Service 8bbac7
	return x;                       /* x is integral */
Packit Service 8bbac7
      if (i0 > 0)
Packit Service 8bbac7
	{
Packit Service 8bbac7
	  if (j0 == 20)
Packit Service 8bbac7
	    i0 += 1;
Packit Service 8bbac7
	  else
Packit Service 8bbac7
	    {
Packit Service 8bbac7
	      j = i1 + (1 << (52 - j0));
Packit Service 8bbac7
	      if (j < i1)
Packit Service 8bbac7
		i0 += 1;                /* got a carry */
Packit Service 8bbac7
	      i1 = j;
Packit Service 8bbac7
	    }
Packit Service 8bbac7
	}
Packit Service 8bbac7
      i1 &= (~i);
Packit 6c4009
    }
Packit Service 8bbac7
  INSERT_WORDS (x, i0, i1);
Packit 6c4009
  return x;
Packit 6c4009
}
Packit 6c4009
#ifndef __ceil
Packit 6c4009
libm_alias_double (__ceil, ceil)
Packit 6c4009
#endif