Related articles |
---|
[2 earlier articles] |
Re: Floating point constant question chase@Think.COM (1994-03-29) |
Re: Floating point constant question bill@amber.csd.harris.com (1994-03-29) |
Re: Floating point constant question maydan@mti.mti.sgi.com (1994-03-29) |
Re: Floating point constant question hbaker@netcom.com (1994-03-30) |
Re: Floating point constant question conte@ece.scarolina.edu (1994-03-30) |
Re: Floating point constant question chase@Think.COM (1994-03-30) |
Re: Floating point constant question hbaker@netcom.com (1994-03-31) |
Re: Floating point constant question przemek@rrdjazz.nist.gov (1994-03-31) |
Newsgroups: | comp.compilers |
From: | hbaker@netcom.com (Henry G. Baker) |
Keywords: | arithmetic, optimize |
Organization: | nil |
References: | 94-03-157 94-03-183 |
Date: | Thu, 31 Mar 1994 18:55:42 GMT |
Scott Mahlke <mahlke@crhc.uiuc.edu> writes:
|> I have a question regarding the following compiler optimization:
|> x = y / 500.0; ===> x = y * 0.002;
Here's a real, live example taken from my paper "Computing A*B (mod N)
Efficiently in ANSI C", Sigplan Not. 27,1 (Jan 1992), 95-98.
(I'll try to type it by hand w/o making transcription errors)
void emul(d,q,r,hp,lp) unsigned long d,q,r,*hp,*lp;
/* 31x31+31 bit multiplication and addition. */
{unsigned long l; double fd,fr,fl;
fd=d; fr=r; fl=l=(d*q+r)&0x7fffffff; *lp=l;
*hp=((q&0x7fff0000)*fd+(((q&0xffff)*fd+fr)-fl))/2147483648.0;}
^^^^^^^^^^^^^
This scheme works pretty well on the 80860, where integer multiplication
is done by the floating point unit, anyway, so there isn't any efficiency
loss (well, hardly any efficiency loss) in converting to float. In any
case, I think the Metaware C compiler _does_ convert this division into a
multiplication, which is ok, since the divisor is a power of 2 and exactly
representable.
While we are on the subject, why don't ANSI C compilers open code the
math.h 'ldexp' function? When you need it, you really need it to be fast;
otherwise, it's pretty much useless. Most of the floating point units
have this functionality as a single instruction, so this shouldn't be a
big deal. The usual optimizations should apply -- a constant second
argument should be faster, etc.
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.