diff options
-rwxr-xr-x | configure | 27 | ||||
-rw-r--r-- | lib.c | 28 |
2 files changed, 51 insertions, 4 deletions
@@ -1432,6 +1432,33 @@ else printf "no\n" fi +printf "Checking for fpclassify ..." + +cat > conftest.c <<! +#include <math.h> + +int main(void) +{ + double x = 3.14; + switch (fpclassify(x)) { + case FP_ZERO: + case FP_NORMAL: + case FP_SUBNORMAL: + case FP_INFINITE: + case FP_NAN: + default: + break; + } + return 0; +} +! +if conftest ; then + printf "yes\n" + printf "#define HAVE_FPCLASSIFY 1\n" >> config.h +else + printf "no\n" +fi + # # Valgrind # @@ -3268,12 +3268,32 @@ cnum c_fixnum(val num, val self) } } +#if HAVE_FPCLASSIFY +INLINE int bad_float(double d) +{ + switch fpclassify(d) { + case FP_ZERO: + case FP_NORMAL: + case FP_SUBNORMAL: + return 0; + default: + return 1; + } +} +#else +#define bad_float(d) (0) +#endif + val flo(double n) { - val obj = make_obj(); - obj->fl.type = FLNUM; - obj->fl.n = n; - return obj; + if (bad_float(n)) { + uw_throw(numeric_error_s, lit("out-of-range floating-point result")); + } else { + val obj = make_obj(); + obj->fl.type = FLNUM; + obj->fl.n = n; + return obj; + } } double c_flo(val num, val self) |