1 changed files with 42 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||||||
|
#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, |
||||||
|
old_excepts; // previous masks
|
||||||
|
|
||||||
|
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, |
||||||
|
old_excepts; // all previous masks
|
||||||
|
|
||||||
|
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 // APPLE
|
Loading…
Reference in new issue