diff --git a/src/lisp/s_scalbn.c b/src/lisp/s_scalbn.c index 4889385f940103d4eb0f96ff70648da115755ac3..1993bbb3fcfe9d18bbe92a31daffe708de9543c3 100644 --- a/src/lisp/s_scalbn.c +++ b/src/lisp/s_scalbn.c @@ -52,15 +52,24 @@ tiny = 1.0e-300; k = ((hx&0x7ff00000)>>20) - 54; if (n< -50000) return fdlibm_setexception(x, FDLIBM_UNDERFLOW);; /*underflow*/ } - if (k==0x7ff) return x+x; /* NaN or Inf */ + if (k==0x7ff) { + /* NaN or Inf */ + if(((hx&0xfffff)|lx)!=0) { + return fdlibm_setexception(x, FDLIBM_INVALID); + } else { + return fdlibm_setexception(x, FDLIBM_OVERFLOW); + } + } + k = k+n; if (k > 0x7fe) return fdlibm_setexception(x, FDLIBM_OVERFLOW); /* overflow */ if (k > 0) /* normal result */ {ux.i[HIWORD] = (hx&0x800fffff)|(k<<20); return x;} - if (k <= -54) + if (k <= -54) { if (n > 50000) /* in case integer overflow in n+k */ return fdlibm_setexception(x, FDLIBM_OVERFLOW); /*overflow*/ else return fdlibm_setexception(x, FDLIBM_UNDERFLOW); /*underflow*/ + } k += 54; /* subnormal result */ ux.i[HIWORD] = (hx&0x800fffff)|(k<<20); return x*twom54;