diff options
Diffstat (limited to 'src/math/round.c')
-rw-r--r-- | src/math/round.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/math/round.c b/src/math/round.c index 4b38d1fd..130d58d2 100644 --- a/src/math/round.c +++ b/src/math/round.c @@ -1,5 +1,12 @@ #include "libm.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 round(double x) { union {double f; uint64_t i;} u = {x}; @@ -12,10 +19,10 @@ double round(double x) x = -x; if (e < 0x3ff-1) { /* raise inexact if x!=0 */ - FORCE_EVAL(x + 0x1p52); + FORCE_EVAL(x + toint); return 0*u.f; } - y = (double)(x + 0x1p52) - 0x1p52 - x; + y = x + toint - toint - x; if (y > 0.5) y = y + x - 1; else if (y <= -0.5) |