Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Feb 2015 11:13:55 -0800
From:      Steve Kargl <sgk@troutmask.apl.washington.edu>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, "Pedro F. Giffuni" <pfg@freebsd.org>, src-committers@freebsd.org
Subject:   Re: svn commit: r278154 - head/lib/msun/src
Message-ID:  <20150203191355.GA13447@troutmask.apl.washington.edu>
In-Reply-To: <20150204035337.Y2718@besplex.bde.org>
References:  <201502031417.t13EHU9g074687@svn.freebsd.org> <20150204012614.T1972@besplex.bde.org> <20150203163329.GA12706@troutmask.apl.washington.edu> <20150204035337.Y2718@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 04, 2015 at 04:37:14AM +1100, Bruce Evans wrote:
> On Tue, 3 Feb 2015, Steve Kargl wrote:
> 
> > -#include <limits.h>
> > +#include <float.h>
> > #include <math.h>
> >
> > +#define	FLT_LARGE	FLT_MAX_EXP - FLT_MIN_EXP + FLT_MANT_DIG
> > +#define	FLT_SMALL	FLT_MIN_EXP - FLT_MAX_EXP
> > +#define	DBL_LARGE	DBL_MAX_EXP - DBL_MIN_EXP + DBL_MANT_DIG
> > +#define	DBL_SMALL	DBL_MIN_EXP - DBL_MAX_EXP
> > +#define	LDBL_LARGE	LDBL_MAX_EXP - LDBL_MIN_EXP + LDBL_MANT_DIG
> > +#define	LDBL_SMALL	LDBL_MIN_EXP - LDBL_MAX_EXP
> > +
> 
> This is a lot of code and bugs (missing parentheses) for negative gain.

My crystal ball isn't function too well lately.

> To work, it depends on all of the above expressions having results that
> can be represented as an int.  There is no guarantee of this in general.

On all architecture that FreeBSD currently supports, there is a guarantee
to the extent that src/sys/${MACHINE}/include/_limits.h shows

#define	__INT_MAX	0x7fffffff
#define	__INT_MIN	(-0x7fffffff - 1)

> However, we can show that the above values are within certain fixed
> limits just as easily as we can show that they are within the INT32
> limits, and then hard-code the fixed limits.  E,g, +-16384 might work,
> and +-32768 surely works when the exponent field is limited to 8 bits.
> Double a few more times for safety.  Hard-coding a limit related to
> an assumed maximum supported width for the exponent field is easier
> to get right that the above expressions.  I think the above are quite
> buggy, and so are my +-16384 and +-32768.  The full exponent range
> plus more for denormals is needed in both directions.  You only have
> it for the LARGE direction.  This can be hard-coded for a 15-bit
> exponent field as +-32768 +- extras for denormals, -+ a couple for
> special exponents.  This needs strictly larger than 16-bit ints for
> the denormals only.  Make it +-65536 to avoid having to count carefully
> to avoid off-by-1 errors.  Double a few times for larger exponent fields,
> or just add assertions to detect increases of the maxima, or just hard-
> code the limits as the int32_t extrema.

Given that the widest field width in IEEE754-2008 for
binary128 is 15, which gives a maximum unbiased exponent
of 2**15, then using +-65536 should cover our needs.  The
functions scalbn[fl] can then deal with values of n 
that may result in exponents that are too small or too 
large.  Untested diff below.

-- 
Steve

Index: s_scalbln.c
===================================================================
--- s_scalbln.c	(revision 278165)
+++ s_scalbln.c	(working copy)
@@ -27,17 +27,17 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <limits.h>
 #include <math.h>
 
+#define	LARGE	65536
+#define	SMALL	-65536
+
 double
 scalbln (double x, long n)
 {
 	int in;
 
-	in = (int)n;
-	if (in != n)
-		in = (n > 0) ? INT_MAX: INT_MIN;
+	in = n > LARGE ? LARGE : n < SMALL ? SMALL : n;
 	return (scalbn(x, in));
 }
 
@@ -46,9 +46,7 @@
 {
 	int in;
 
-	in = (int)n;
-	if (in != n)
-		in = (n > 0) ? INT_MAX: INT_MIN;
+	in = n > LARGE ? LARGE : n < SMALL ? SMALL : n;
 	return (scalbnf(x, in));
 }
 
@@ -57,8 +55,6 @@
 {
 	int in;
 
-	in = (int)n;
-	if (in != n)
-		in = (n > 0) ? INT_MAX: INT_MIN;
+	in = n > LARGE ? LARGE : n < SMALL ? SMALL : n;
 	return (scalbnl(x, in));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150203191355.GA13447>