author | Rich Felker <dalias@aerifal.cx> | 2012年03月16日 23:58:49 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012年03月16日 23:58:49 -0400 |
commit | 2e77dc13f8bc2053642fcb136996f5f36c88c775 (patch) | |
tree | c0fc346570b01898381431c51cd7520a22c402fb /src/math/fmal.c | |
parent | 8c071f872b2844ca297275176047f8d23eec96a7 (diff) | |
download | musl-2e77dc13f8bc2053642fcb136996f5f36c88c775.tar.gz |
-rw-r--r-- | src/math/fmal.c | 14 |
diff --git a/src/math/fmal.c b/src/math/fmal.c index 200bd5a5..3944c292 100644 --- a/src/math/fmal.c +++ b/src/math/fmal.c @@ -194,27 +194,37 @@ long double fmal(long double x, long double y, long double z) * modes other than FE_TONEAREST are painful. */ if (spread < -LDBL_MANT_DIG) { +#ifdef FE_INEXACT feraiseexcept(FE_INEXACT); +#endif +#ifdef FE_UNDERFLOW if (!isnormal(z)) feraiseexcept(FE_UNDERFLOW); +#endif switch (oround) { - case FE_TONEAREST: + default: /* FE_TONEAREST */ return (z); +#ifdef FE_TOWARDZERO case FE_TOWARDZERO: if (x > 0.0 ^ y < 0.0 ^ z < 0.0) return (z); else return (nextafterl(z, 0)); +#endif +#ifdef FE_DOWNWARD case FE_DOWNWARD: if (x > 0.0 ^ y < 0.0) return (z); else return (nextafterl(z, -INFINITY)); - default: /* FE_UPWARD */ +#endif +#ifdef FE_UPWARD + case FE_UPWARD: if (x > 0.0 ^ y < 0.0) return (nextafterl(z, INFINITY)); else return (z); +#endif } } if (spread <= LDBL_MANT_DIG * 2) |