roundf.c raw

   1  #include "libm.h"
   2  
   3  #if FLT_EVAL_METHOD==0
   4  #define EPS FLT_EPSILON
   5  #elif FLT_EVAL_METHOD==1
   6  #define EPS DBL_EPSILON
   7  #elif FLT_EVAL_METHOD==2
   8  #define EPS LDBL_EPSILON
   9  #endif
  10  static const float_t toint = 1/EPS;
  11  
  12  float roundf(float x)
  13  {
  14  	union {float f; uint32_t i;} u = {x};
  15  	int e = u.i >> 23 & 0xff;
  16  	float_t y;
  17  
  18  	if (e >= 0x7f+23)
  19  		return x;
  20  	if (u.i >> 31)
  21  		x = -x;
  22  	if (e < 0x7f-1) {
  23  		FORCE_EVAL(x + toint);
  24  		return 0*u.f;
  25  	}
  26  	y = x + toint - toint - x;
  27  	if (y > 0.5f)
  28  		y = y + x - 1;
  29  	else if (y <= -0.5f)
  30  		y = y + x + 1;
  31  	else
  32  		y = y + x;
  33  	if (u.i >> 31)
  34  		y = -y;
  35  	return y;
  36  }
  37