roundl.c raw

   1  #include "libm.h"
   2  
   3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
   4  long double roundl(long double x)
   5  {
   6  	return round(x);
   7  }
   8  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
   9  
  10  static const long double toint = 1/LDBL_EPSILON;
  11  
  12  long double roundl(long double x)
  13  {
  14  	union ldshape u = {x};
  15  	int e = u.i.se & 0x7fff;
  16  	long double y;
  17  
  18  	if (e >= 0x3fff+LDBL_MANT_DIG-1)
  19  		return x;
  20  	if (u.i.se >> 15)
  21  		x = -x;
  22  	if (e < 0x3fff-1) {
  23  		FORCE_EVAL(x + toint);
  24  		return 0*u.f;
  25  	}
  26  	y = x + toint - toint - x;
  27  	if (y > 0.5)
  28  		y = y + x - 1;
  29  	else if (y <= -0.5)
  30  		y = y + x + 1;
  31  	else
  32  		y = y + x;
  33  	if (u.i.se >> 15)
  34  		y = -y;
  35  	return y;
  36  }
  37  #endif
  38