diff options
Diffstat (limited to 'winsup/mingw/mingwex/math/modfl.c')
-rw-r--r-- | winsup/mingw/mingwex/math/modfl.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/math/modfl.c b/winsup/mingw/mingwex/math/modfl.c new file mode 100644 index 000000000..5663956f0 --- /dev/null +++ b/winsup/mingw/mingwex/math/modfl.c @@ -0,0 +1,21 @@ +#include <fenv.h> +#include <math.h> +#include <errno.h> +#define FE_ROUNDING_MASK \ + (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO) + +long double +modfl (long double value, long double* iptr) +{ + long double int_part; + unsigned short saved_cw; + /* truncate */ + asm ("fnstcw %0;" : "=m" (saved_cw)); /* save control word */ + asm ("fldcw %0;" : : "m" ((saved_cw & ~FE_ROUNDING_MASK) + | FE_TOWARDZERO)); + asm ("frndint;" : "=t" (int_part) : "0" (value)); /* round */ + asm ("fldcw %0;" : : "m" (saved_cw)); /* restore saved cw */ + if (iptr) + *iptr = int_part; + return (isinf (value) ? 0.0L : value - int_part); +} |