diff options
Diffstat (limited to 'src/math')
| -rw-r--r-- | src/math/nearbyint.c | 23 | ||||
| -rw-r--r-- | src/math/nearbyintf.c | 14 | ||||
| -rw-r--r-- | src/math/nearbyintl.c | 11 | 
3 files changed, 29 insertions, 19 deletions
| diff --git a/src/math/nearbyint.c b/src/math/nearbyint.c index 714c55ca..7a4c58cf 100644 --- a/src/math/nearbyint.c +++ b/src/math/nearbyint.c @@ -1,20 +1,19 @@  #include <fenv.h>  #include <math.h> -/* -rint may raise inexact (and it should not alter the fenv otherwise) -nearbyint must not raise inexact +/* nearbyint is the same as rint, but it must not raise the inexact exception */ -(according to ieee754r section 7.9 both functions should raise invalid -when the input is signaling nan, but c99 does not define snan so saving -and restoring the entire fenv should be fine) -*/ +double nearbyint(double x) +{ +#ifdef FE_INEXACT +	int e; -double nearbyint(double x) { -	fenv_t e; - -	fegetenv(&e); +	e = fetestexcept(FE_INEXACT); +#endif  	x = rint(x); -	fesetenv(&e); +#ifdef FE_INEXACT +	if (!e) +		feclearexcept(FE_INEXACT); +#endif  	return x;  } diff --git a/src/math/nearbyintf.c b/src/math/nearbyintf.c index 07df8f54..39c3d73b 100644 --- a/src/math/nearbyintf.c +++ b/src/math/nearbyintf.c @@ -1,11 +1,17 @@  #include <fenv.h>  #include <math.h> -float nearbyintf(float x) { -	fenv_t e; +float nearbyintf(float x) +{ +#ifdef FE_INEXACT +	int e; -	fegetenv(&e); +	e = fetestexcept(FE_INEXACT); +#endif  	x = rintf(x); -	fesetenv(&e); +#ifdef FE_INEXACT +	if (!e) +		feclearexcept(FE_INEXACT); +#endif  	return x;  } diff --git a/src/math/nearbyintl.c b/src/math/nearbyintl.c index 2906f383..0ff4b1f9 100644 --- a/src/math/nearbyintl.c +++ b/src/math/nearbyintl.c @@ -10,11 +10,16 @@ long double nearbyintl(long double x)  #include <fenv.h>  long double nearbyintl(long double x)  { -	fenv_t e; +#ifdef FE_INEXACT +	int e; -	fegetenv(&e); +	e = fetestexcept(FE_INEXACT); +#endif  	x = rintl(x); -	fesetenv(&e); +#ifdef FE_INEXACT +	if (!e) +		feclearexcept(FE_INEXACT); +#endif  	return x;  }  #endif | 
