delorie.com/archives/browse.cgi search
Mail Archives: djgpp/1997/08/04/06:23:31

 Sender: crough45 AT amc DOT de Message-Id: <97Aug4.121755gmt+0100.17047@internet01.amc.de> Date: Mon, 4 Aug 1997 11:21:01 +0100 From: Chris Croughton Mime-Version: 1.0 To: pweeks AT execulink DOT com Cc: djgpp AT delorie DOT com Subject: Re: 16.16 fixed point math multiply (overflow problems)

Jeff Weeks wrote:

> My multiply function overflows everytime, and it's obvious why.
> Here's what I do:
>
> (x * y) >> 16;

Yes, that obviously won't work.  My suggestion is to divide it
into integer and fractional parts.

Split x into xh (high 16 bits) and xl (low 16 bits), similarly
with y into yh and yl.  So x = (xh<<16) + xl, etc.  Then:

result = ((xh*yh)<<16) + (xh*yl + xl*yh) + ((xl*yl)>>16)

You'll lose the top 16 bits of xh*yh, of course, but that's
inevitable, the same way as you lose the bottom 16 bits.  If
you're really concerned you could think about rounding the bottom
bit, but it probably doesn't matter too much.

Oh, and note this works for unsigned but will probably do all
sorts of odd things with signed...

HTH,
Chris C

- Raw text -

 webmaster delorie software   privacy Copyright © 2019   by DJ Delorie Updated Jul 2019