From a53d7ef42da5bf984ae51dc4d082accac2787ceb Mon Sep 17 00:00:00 2001 From: Raymond Toy <toy.raymond@gmail.com> Date: Wed, 23 Dec 2015 14:14:13 -0800 Subject: [PATCH] Use setexception to raise the inexact exception. o Update fdlibm.h and setexception.c to support the inexact execption. o Use this in asinh. Tests pass. --- src/lisp/fdlibm.h | 3 ++- src/lisp/s_asinh.c | 7 ++++++- src/lisp/setexception.c | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/lisp/fdlibm.h b/src/lisp/fdlibm.h index abd6e80d7..8cc4dd253 100644 --- a/src/lisp/fdlibm.h +++ b/src/lisp/fdlibm.h @@ -61,7 +61,8 @@ enum FDLIBM_EXCEPTION { FDLIBM_DIVIDE_BY_ZERO, FDLIBM_UNDERFLOW, FDLIBM_OVERFLOW, - FDLIBM_INVALID + FDLIBM_INVALID, + FDLIBM_INEXACT }; extern double fdlibm_setexception(double x, enum FDLIBM_EXCEPTION); diff --git a/src/lisp/s_asinh.c b/src/lisp/s_asinh.c index dc99e5b94..5c33cbaf6 100644 --- a/src/lisp/s_asinh.c +++ b/src/lisp/s_asinh.c @@ -59,7 +59,12 @@ huge= 1.00000000000000000000e+300; } if(ix< 0x3e300000) { /* |x|<2**-28 */ - if(huge+x>one) return x; /* return x inexact except 0 */ + /* return x inexact except 0 */ + if (x != 0) { + fdlibm_setexception(x, FDLIBM_INEXACT); + } + + return x; } if(ix>0x41b00000) { /* |x| > 2**28 */ w = __ieee754_log(fabs(x))+ln2; diff --git a/src/lisp/setexception.c b/src/lisp/setexception.c index fc2bcc1d4..e70c3f901 100644 --- a/src/lisp/setexception.c +++ b/src/lisp/setexception.c @@ -88,6 +88,10 @@ fdlibm_setexception(double x, enum FDLIBM_EXCEPTION type) break; } + case FDLIBM_INEXACT: + feraiseexcept(FE_INEXACT); + ret = x; + break; default: /* Shouldn't happen! */ ret = 0.0; -- GitLab