diff --git a/libraries/AP_Common/missing/fenv.h b/libraries/AP_Common/missing/fenv.h index c9cc508f58..cbcbef2f64 100644 --- a/libraries/AP_Common/missing/fenv.h +++ b/libraries/AP_Common/missing/fenv.h @@ -2,6 +2,7 @@ #include_next +#ifndef HAVE_FEENABLEEXCEPT #if defined(__APPLE__) && defined(__MACH__) // Public domain polyfill for feenableexcept on OS X @@ -45,4 +46,29 @@ inline int fedisableexcept(unsigned int excepts) return fesetenv(&fenv) ? -1 : old_excepts; } +#else +inline int feenableexcept(unsigned int excepts) +{ + #pragma STDC FENV_ACCESS ON + fexcept_t flags; + /* Save current exception flags. */ + fegetexceptflag(&flags, FE_ALL_EXCEPT); + + feclearexcept(FE_ALL_EXCEPT); /* clear all fp exception conditions */ + return fesetexceptflag(&flags, excepts) != 0 ? -1 : flags; /* set new flags */ + +} + +inline int fedisableexcept(unsigned int excepts) +{ + #pragma STDC FENV_ACCESS ON + fexcept_t flags; + /* Save current exception flags. */ + fegetexceptflag(&flags, FE_ALL_EXCEPT); + + feclearexcept(FE_ALL_EXCEPT); /* clear all fp exception conditions */ + return fesetexceptflag(&flags, ~excepts) != 0 ? -1 : flags; /* set new flags */ +} + +#endif #endif