diff --git a/src/lisp/fdlibm.h b/src/lisp/fdlibm.h index abd6e80d76d82c8cbbc7cb5902e58cc4d15550c5..8cc4dd253994d22f71d797bc1985ea758521631a 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 dc99e5b943a4fac47e2d44596481eb7e0da05522..5c33cbaf66dbb42e183bf22af01f4bb31d8421c9 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 fc2bcc1d4841ed108a8d36535b4609b92e5236b5..e70c3f901555f6ab20072e932c94790cb1067049 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;