X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Futil.c;h=a44b5f664a69432c212dd38ce67123be572b91f3;hb=667aded8ff906ada3cde9bc1483768133300b4d3;hp=3875695cd5103bb1b7942fab362a7cd2fb1b43e1;hpb=f9d17902a35b6403b7c8354845e9f13f882c1c8e;p=libc-test diff --git a/src/math/util.c b/src/math/util.c index 3875695..a44b5f6 100644 --- a/src/math/util.c +++ b/src/math/util.c @@ -43,8 +43,11 @@ float ulperrf(float got, float want, float dwant) { if (isnan(got) && isnan(want)) return 0; - if (got == want && signbit(got) == signbit(want)) - return dwant; + if (got == want) { + if (signbit(got) == signbit(want)) + return dwant; + return inf; + } if (isinf(got)) { got = copysignf(0x1p127, got); want *= 0.5; @@ -56,8 +59,11 @@ float ulperr(double got, double want, float dwant) { if (isnan(got) && isnan(want)) return 0; - if (got == want && signbit(got) == signbit(want)) - return dwant; + if (got == want) { + if (signbit(got) == signbit(want)) + return dwant; + return inf; // treat 0 sign errors badly + } if (isinf(got)) { got = copysign(0x1p1023, got); want *= 0.5; @@ -72,13 +78,16 @@ float ulperrl(long double got, long double want, float dwant) #elif LDBL_MANT_DIG == 64 if (isnan(got) && isnan(want)) return 0; - if (got == want && signbit(got) == signbit(want)) - return dwant; + if (got == want) { + if (signbit(got) == signbit(want)) + return dwant; + return inf; + } if (isinf(got)) { got = copysignl(0x1p16383L, got); want *= 0.5; } - return scalbn(got - want, -eulpl(want)) + dwant; + return scalbnl(got - want, -eulpl(want)) + dwant; #else // TODO return inf; @@ -121,21 +130,15 @@ char *rstr(int r) { switch (r) { case RN: return "RN"; +#ifdef FE_TOWARDZERO case RZ: return "RZ"; +#endif +#ifdef FE_UPWARD case RU: return "RU"; +#endif +#ifdef FE_DOWNWARD case RD: return "RD"; +#endif } return "R?"; } - -void setupfenv(int r) -{ - fesetround(r); - feclearexcept(FE_ALL_EXCEPT); -} - -int getexcept(void) -{ - return fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); -} -