X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Fceil.c;h=b13e6f2d63689818ff349f1327fb5d1bb25eb49d;hb=0ce946cf808274c2d6e5419b139e130c8ad4bd30;hp=22dc224c5f38b1fdebbdba03d36bf0f408298baa;hpb=79ca86094d70f43252b683c3a3ccb572d462cf28;p=musl diff --git a/src/math/ceil.c b/src/math/ceil.c index 22dc224c..b13e6f2d 100644 --- a/src/math/ceil.c +++ b/src/math/ceil.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 ceil(double x) { union {double f; uint64_t i;} u = {x}; @@ -10,9 +17,9 @@ double ceil(double x) return x; /* y = int(x) - x, where int(x) is an integer neighbor of x */ if (u.i >> 63) - y = (double)(x - 0x1p52) + 0x1p52 - x; + y = x - toint + toint - x; else - y = (double)(x + 0x1p52) - 0x1p52 - x; + y = x + toint - toint - x; /* special case because of non-nearest rounding modes */ if (e <= 0x3ff-1) { FORCE_EVAL(y);