From ee2ee92d62c43f6658d37ddea4c316d2089d0fe9 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Tue, 3 Sep 2013 04:09:12 +0000 Subject: math: rewrite remainder functions (remainder, remquo, fmod, modf) * results are exact * modfl follows truncl (raises inexact flag spuriously now) * modf and modff only had cosmetic cleanup * remainder is just a wrapper around remquo now * using iterative shift+subtract for remquo and fmod * ld80 and ld128 are supported as well --- src/math/modff.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'src/math/modff.c') diff --git a/src/math/modff.c b/src/math/modff.c index 90caf316..639514ef 100644 --- a/src/math/modff.c +++ b/src/math/modff.c @@ -2,36 +2,33 @@ float modff(float x, float *iptr) { - union {float x; uint32_t n;} u = {x}; + union {float f; uint32_t i;} u = {x}; uint32_t mask; - int e; - - e = (int)(u.n>>23 & 0xff) - 0x7f; + int e = (int)(u.i>>23 & 0xff) - 0x7f; /* no fractional part */ if (e >= 23) { *iptr = x; - if (e == 0x80 && u.n<<9 != 0) { /* nan */ + if (e == 0x80 && u.i<<9 != 0) { /* nan */ return x; } - u.n &= 0x80000000; - return u.x; + u.i &= 0x80000000; + return u.f; } /* no integral part */ if (e < 0) { - u.n &= 0x80000000; - *iptr = u.x; + u.i &= 0x80000000; + *iptr = u.f; return x; } mask = 0x007fffff>>e; - if ((u.n & mask) == 0) { + if ((u.i & mask) == 0) { *iptr = x; - u.n &= 0x80000000; - return u.x; + u.i &= 0x80000000; + return u.f; } - u.n &= ~mask; - *iptr = u.x; - STRICT_ASSIGN(float, x, x - *iptr); - return x; + u.i &= ~mask; + *iptr = u.f; + return x - u.f; } -- cgit v1.2.1