12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #pragma once
- #include_next <fenv.h>
- #if defined(__APPLE__) && defined(__MACH__)
- // Public domain polyfill for feenableexcept on OS X
- // http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c
- inline int feenableexcept(unsigned int excepts)
- {
- static fenv_t fenv;
- unsigned int new_excepts = excepts & FE_ALL_EXCEPT;
- // previous masks
- unsigned int old_excepts;
- if (fegetenv(&fenv)) {
- return -1;
- }
- old_excepts = fenv.__control & FE_ALL_EXCEPT;
- // unmask
- fenv.__control &= ~new_excepts;
- fenv.__mxcsr &= ~(new_excepts << 7);
- return fesetenv(&fenv) ? -1 : old_excepts;
- }
- inline int fedisableexcept(unsigned int excepts)
- {
- static fenv_t fenv;
- unsigned int new_excepts = excepts & FE_ALL_EXCEPT;
- // all previous masks
- unsigned int old_excepts;
- if (fegetenv(&fenv)) {
- return -1;
- }
- old_excepts = fenv.__control & FE_ALL_EXCEPT;
- // mask
- fenv.__control |= new_excepts;
- fenv.__mxcsr |= new_excepts << 7;
- return fesetenv(&fenv) ? -1 : old_excepts;
- }
- #endif
|