github.com/afumu/libc@v0.0.6/musl/src/math/roundf.c (about)

     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  }