From f0af0a900f8f2790fe6a3e63a49af11687289567 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Fri, 13 May 2005 14:59:00 +0000 Subject: [PATCH] isinf() & isnan() implemented [r5844] --- win32/math.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/win32/math.c b/win32/math.c index 0a19dac88..9179f43a1 100644 --- a/win32/math.c +++ b/win32/math.c @@ -1,11 +1,77 @@ -#include "fltcalc.h" +#include "ieee754.h" +#include "config.h" -int isnan(LLDBL v) +static int __isnan(double d) { + union ieee754_double f; + + f.d = d; + if (f.ieee.exponent == 0x7FF && + (f.ieee.mantissa0 != 0 || + f.ieee.mantissa1 != 0)) + return 1; + + return 0; +} + +static int __isnanl(long double d) +{ + union ieee854_long_double f; + + f.d = d; + if (f.ieee_nan.exponent == 0x7FFF && + (f.ieee_nan.quiet_nan || + f.ieee_nan.mantissa1 || + f.ieee_nan.mantissa0)) + return 1; return 0; } -int isinf(LLDBL v) +static int __isinf(double d) { + union ieee754_double f; + + f.d = d; + if (f.ieee.exponent == 0x7FF && + f.ieee.mantissa0 == 0 && + f.ieee.mantissa1 == 0) + return 1; + return 0; } + +static int __isinfl(long double d) +{ + union ieee854_long_double f; + + f.d = d; + if (f.ieee.exponent == 0x7FFF && + f.ieee_nan.mantissa1 == 0x80000000 && + f.ieee_nan.mantissa0 == 0) + return 1; + + return 0; +} + +#ifdef HAVE_LONG_DOUBLE +int isnan(long double d) +{ + return __isnanl(d); +} + +int isinf(long double d) +{ + return __isinfl(d); +} + +#else +int isnan(double d) +{ + return __isnan(d); +} + +int isinf(double d) +{ + return __isinf(d); +} +#endif /* HAVE_LONG_DOUBLE */ -- 2.20.1