From 06696f40afe58a231e2531c8bf6d9f0dadb92e51 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Sun, 3 Mar 2019 21:25:50 -0500 Subject: outline details from C18 annex F --- src/math/round.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/math/round.c') diff --git a/src/math/round.c b/src/math/round.c index c154bdbf..5eedd578 100644 --- a/src/math/round.c +++ b/src/math/round.c @@ -1,10 +1,33 @@ # define TGSOURCE "round.c" #include "_tgmath.h" #include +#include "fenv.h" + +#ifndef __GNUC__ +#pragma STDC FENV_ACCESS ON +#endif TYPE TGFN(round)(TYPE x) { - return x; + switch (fpclassify(x)) { + case FP_ZERO: return x; + case FP_INFINITE: return x; + default: break; + } + + fenv_t save_env; + feholdexcept(&save_env); + + TYPE ret = TGFN(rint)(x); + + if (fetestexcept(FE_INEXACT)) { + fesetround(FE_TOWARDZERO); + ret = TGFN(rint)(TGFN(copysign)(0.5 + TGFN(fabs)(x), x)); + } + + feupdateenv(&save_env); + + return ret; } /* -- cgit v1.2.1