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