diff options
| -rw-r--r-- | src/math/rint.c | 12 | ||||
| -rw-r--r-- | src/math/rintf.c | 14 | 
2 files changed, 22 insertions, 4 deletions
| diff --git a/src/math/rint.c b/src/math/rint.c index 81f4e622..fbba390e 100644 --- a/src/math/rint.c +++ b/src/math/rint.c @@ -1,6 +1,14 @@ +#include <float.h>  #include <math.h>  #include <stdint.h> +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; +  double rint(double x)  {  	union {double f; uint64_t i;} u = {x}; @@ -11,9 +19,9 @@ double rint(double x)  	if (e >= 0x3ff+52)  		return x;  	if (s) -		y = (double)(x - 0x1p52) + 0x1p52; +		y = x - toint + toint;  	else -		y = (double)(x + 0x1p52) - 0x1p52; +		y = x + toint - toint;  	if (y == 0)  		return s ? -0.0 : 0;  	return y; diff --git a/src/math/rintf.c b/src/math/rintf.c index 9cfc2a26..9047688d 100644 --- a/src/math/rintf.c +++ b/src/math/rintf.c @@ -1,6 +1,16 @@ +#include <float.h>  #include <math.h>  #include <stdint.h> +#if FLT_EVAL_METHOD==0 +#define EPS FLT_EPSILON +#elif FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const float_t toint = 1/EPS; +  float rintf(float x)  {  	union {float f; uint32_t i;} u = {x}; @@ -11,9 +21,9 @@ float rintf(float x)  	if (e >= 0x7f+23)  		return x;  	if (s) -		y = (float)(x - 0x1p23f) + 0x1p23f; +		y = x - toint + toint;  	else -		y = (float)(x + 0x1p23f) - 0x1p23f; +		y = x + toint - toint;  	if (y == 0)  		return s ? -0.0f : 0.0f;  	return y; | 
