X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Futil.c;h=f02f5a033a207075ad666885d5ac142ad75b051b;hb=7fd3b84625cfa955207526eda74d9261c5324549;hp=3875695cd5103bb1b7942fab362a7cd2fb1b43e1;hpb=f9d17902a35b6403b7c8354845e9f13f882c1c8e;p=libc-test diff --git a/src/math/util.c b/src/math/util.c index 3875695..f02f5a0 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,8 +78,11 @@ 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; @@ -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); -} -