make fma and lrint functions build without full fenv support
this is necessary to support archs where fenv is incomplete or unavailable (presently arm). fma, fmal, and the lrint family should work perfectly fine with this change; fmaf is slightly broken with respect to rounding as it depends on non-default rounding modes to do its work.
This commit is contained in:
parent
8c071f872b
commit
2e77dc13f8
4 changed files with 28 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue