| #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; | |
| unsigned short tmp_cw; | |
| /* truncate */ | |
| asm ("fnstcw %0;" : "=m" (saved_cw)); /* save control word */ | |
| tmp_cw = (saved_cw & ~FE_ROUNDING_MASK) | FE_TOWARDZERO; | |
| asm ("fldcw %0;" : : "m" (tmp_cw)); | |
| 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); | |
| } |