Introduce the macro LOG2_INTERVAL, which is log2(number of intervals).

Use the macroi as a micro-optimization to convert a subtraction and
division to a shift.

Obtained from:	bde
This commit is contained in:
Steve Kargl 2013-06-03 17:51:08 +00:00
parent 24150d37d3
commit 4aa8c9453f
2 changed files with 5 additions and 2 deletions

View File

@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include "math_private.h"
#define INTERVALS 128
#define LOG2_INTERVALS 7
#define BIAS (LDBL_MAX_EXP - 1)
static volatile const long double tiny = 0x1p-10000L;
@ -229,7 +230,7 @@ expl(long double x)
fn = x * INV_L + 0x1.8p112 - 0x1.8p112;
n = (int)fn;
n2 = (unsigned)n % INTERVALS;
k = (n - n2) / INTERVALS;
k = n >> LOG2_INTERVALS;
r1 = x - fn * L1;
r2 = -fn * L2;

View File

@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include "math_private.h"
#define INTERVALS 128
#define LOG2_INTERVALS 7
#define BIAS (LDBL_MAX_EXP - 1)
static const long double
@ -269,7 +270,8 @@ expl(long double x)
n = (int)fn;
#endif
n2 = (unsigned)n % INTERVALS;
k = (n - n2) / INTERVALS;
/* Depend on the sign bit being propagated: */
k = n >> LOG2_INTERVALS;
r1 = x - fn * L1;
r2 = -fn * L2;