X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Ffma.c;h=f44ecda77a689b375ff184266ad199126d816d70;hb=9e2a895aaaa4a3985e94ae4f3e24c1af65f9bb34;hp=c53f3148bd83733fc2829be18f56c6563e12b851;hpb=b69f695acedd4ce2798ef9ea28d834ceccc789bd;p=musl diff --git a/src/math/fma.c b/src/math/fma.c index c53f3148..f44ecda7 100644 --- a/src/math/fma.c +++ b/src/math/fma.c @@ -199,27 +199,37 @@ double fma(double x, double y, double z) * modes other than FE_TONEAREST are painful. */ if (spread < -DBL_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 (nextafter(z, 0)); +#endif +#ifdef FE_DOWNWARD case FE_DOWNWARD: if (x > 0.0 ^ y < 0.0) return (z); else return (nextafter(z, -INFINITY)); - default: /* FE_UPWARD */ +#endif +#ifdef FE_UPWARD + case FE_UPWARD: if (x > 0.0 ^ y < 0.0) return (nextafter(z, INFINITY)); else return (z); +#endif } } if (spread <= DBL_MANT_DIG * 2)