31 lines
580 B
C
31 lines
580 B
C
|
#include <fenv.h>
|
||
|
|
||
|
long double
|
||
|
roundl (long double x) {
|
||
|
long double retval;
|
||
|
unsigned short saved_cw, _cw;
|
||
|
__asm__ (
|
||
|
"fnstcw %0;"
|
||
|
: "=m" (saved_cw)
|
||
|
); /* save control word */
|
||
|
_cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
|
||
|
| (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */
|
||
|
__asm__ (
|
||
|
"fldcw %0;"
|
||
|
:
|
||
|
: "m" (_cw)
|
||
|
); /* load the rounding control */
|
||
|
__asm__ (
|
||
|
"frndint;"
|
||
|
: "=t" (retval)
|
||
|
: "0" (x)
|
||
|
); /* do the rounding */
|
||
|
__asm__ (
|
||
|
"fldcw %0;"
|
||
|
:
|
||
|
: "m" (saved_cw)
|
||
|
); /* restore control word */
|
||
|
return retval;
|
||
|
}
|
||
|
|