4.2 frexp() is too slow

mike at BRL-VGR.ARPA mike at BRL-VGR.ARPA
Wed Aug 22 17:05:16 AEST 1984


From:      Mike Muuss <mike at BRL-VGR.ARPA>

Subject: frexp() is too slow

Index:	lib/libc.a 4.2BSD fix

Description:
	When executing a program that uses sqrt() heavily, more time
	is spent in frexp() (called by sqrt()) than in sqrt() itself!
	frexp() just returns the fractional & exponent parts of a
	floating point number.  It's problem is that it's written
	in a nice machine independent manner which is quite portable,
	but also foolish and slow.

	Also, frexp( 1.0, &i ) will return a fractional part of 1.0
	and an exponent of 0, even though the documentation explicitly
	states that the return is LESS THAN 1.0 -- I have fixed this
	problem in both the vax and !vax code, below.

Repeat-By:
	Write a program to use sqrt() a lot.  Profile it with -pg -lm_p
	and count the cycles.
Fix:

/*
 *			F R E X P . C
 *
 * $Revision: 1.2 $
 *
 * $Log:	frexp.c,v $
 * Revision 1.2  84/08/22  02:19:10  mike
 * Created VAX-specific version, much faster!
 * (Even correct, and to spec)
 * 
 */
/* @(#)frexp.c	4.1 (Berkeley) 12/21/80 */
/*
	the call
		x = frexp(arg,&exp);
	must return a double fp quantity x which is <1.0
	and the corresponding binary exponent "exp".
	such that
		arg = x*2^exp
*/

double
frexp(x,i)
double x;
int *i;
{
#ifdef vax
	register short *ip;

	ip = (short *) &x;
	*i = ((*ip>>7) & 0xFF) - 128;
	*ip = (*ip & 0x807F) | (128<<7);
	return(x);
#else
	int neg;
	int j;
	j = 0;
	neg = 0;
	if(x<0){
		x = -x;
		neg = 1;
		}
	if(x>=1.0)		/* was incorrectly x>1.0 */
		while(x>=1.0){
			j = j+1;
			x = x/2;
			}
	else if(x<0.5)
		while(x<0.5){
			j = j-1;
			x = 2*x;
			}
	*i = j;
	if(neg) x = -x;
	return(x);
#endif vax
}

For real speed demons, this might well be coded in VAX assembler.
The following code is UNTESTED, but ought to work:

	.text
	.globl	_frexp
	.align	2
_frexp:	.word	0x0000
	movd	4(ap),r0		# (r0,r1) := value
	extzv	$7,$8,r0,*12(ap)	# Fetch exponent
	jeql	fr1			# If exponent zero, we're done
	subl2	$128,*12(ap)		# Bias the exponent appropriately
	insv	$128,$7,$8,r0		# Force result exponent to biased 0
fr1:	ret

Best,
 -Mike Muuss

(301)-278-6678
  AV  283-6678
  FTS 939-6678

ArpaNet:  Mike @ BRL
UUCP:     ...!{decvax,cbosgd}!brl-bmd!mike
Postal:
  Mike Muuss
  Leader, Advanced Computer Systems Team
  Computer Techniques and Analysis Branch
  Systems Engineering and Concepts Analysis Division
  U.S. Army Ballistic Research Laboratory
  Attn: DRXBR-SECAD (Muuss)
  APG, MD  21005



More information about the Comp.unix.wizards mailing list