[gameprogrammer] Re: Fixed point Math

Hi,

Kevin, you are partly right and partly wrong. I am targetting Opengl ES 
which needs fixed point support. However I am targetting the Khronos contest 
and not the gamedev one and a linux application(game). Anyway I do this for 
a hobby so I figured well - I will aim for the contest.

I changed the following in the code
long long e = FIXMUL(c, d);

This gives me zero as well. However when I do it with floating point 
numbers, I get the values after the decimal(fraction) correctly but the main 
number is zero. Any ideas why it could be truncating ? Lastly I don't think 
OpenGL ES has 64 bit support(so long long may not be supported). So I will 
probably be stuck with int's. But I need to use 15.16 fixed point variables. 
Should I do everything in 7.8 bit and the convert to 15.16 bit ? Would this 
slow things down or make it equal to if I did it with just floats ?

Thanks

Gautam

>------------------------------
>
>From: "Kevin Fields" <drunkendruid@xxxxxxxxxxx>
>Subject: [gameprogrammer] Re: Fixed point math
>Date: Tue, 19 Oct 2004 22:34:38 -0300
>
>I believe it's because the code is meant to run on a cellphone. Correct?
>There's a contest going on at GameDev.Net for people to create 3D game 
>demos
>for cellphones using the BREW and OpenGLES SDKs. Unfortunately, the
>cellphones don't have any floating point support.
>
>Kevin
>
>From: Bob Pendleton <bob@xxxxxxxxxxxxx>
>Reply-To: gameprogrammer@xxxxxxxxxxxxx
>To: Gameprogrammer Mailing List <gameprogrammer@xxxxxxxxxxxxx>
>Subject: [gameprogrammer] Re: Fixed point math
>Date: Tue, 19 Oct 2004 13:49:08 -0500
>
>On Tue, 2004-10-19 at 13:28, Gautam Narain wrote:
>  > Hi,
>  >
>  > I am trying to do fixed point maths. Currently I have the following 
>code.
>  >
>  > #ifndef FPMATH_H
>  > #define FPMATH_H
>  >
>  > #include <GLES/gl.h>
>  >
>  > /* convert an integer to a fixed value */
>  > #define INTTOFIX(x)   ((x)<<16)
>  >
>  > /* convert a float to a fixed value */
>  > #define FLOATTOFIX(x) (x*(1<<16))
>  >
>  > /* convert a fixed point variable to an int */
>  > #define FIXTOINT(x)   ((x)<<16)
>
>The shift is backward here.
>
>  >
>  > /* convert a fixed point variable to a float */
>  > #define FIXTOFLOAT(x) ((float)(x)/65536)
>  >
>  > /* Add 2 fixed variables */
>  > #define FIXADD(x, y) ((x)+(y))
>  >
>  > /* Subtract 2 fixed variables */
>  > #define FIXSUB(x, y) ((x)-(y))
>  >
>  > /* multiply 2 fixed variables */
>  > #define FIXMUL(x, y) (((y)*(x))>>16)
>  >
>  > /* divide 2 fixed variables */
>  > #define FIXDIV(x, y) ((y  << 16)/(x))
>  >
>  > #endif
>  >
>  > However when I do the following I get e as 0 and printf also shows 
>zero.
>  >
>  > #include <stdio.h>
>  > #include "fpmath.h"
>  >
>  > int main()
>  > {
>  >     int a = 1;
>  >     int b = 2;
>  >
>  >     int c = INTTOFIX(a);
>  >     int d = INTTOFIX(b);
>  >
>  >     int e = FIXMUL(c, d);  // e seems to be zero
>  >
>  >     printf("%ld\n", c);
>  >     printf("%ld\n", d);
>  >     printf("%ld\n", FIXMUL(c, d));  // result comes as 0
>  > }
>  >
>  > I am using gcc 3.3.4 if it helps. I am at a loss as to where I am going
>  > wrong. Surely this couldn;t be overflowing ?
>
>Yes, as a matter of fact it is overflowing. When you multiply two fixed
>point numbers with 16 bits of fraction the result has 32 bits of
>fraction. Since your numbers only have 32 bits that means you get
>nothing but fraction in the result. To do what you are trying to do you
>need to use a 64 bit intermediate value. Which you can get at by using
>assembly language. If you want to avoid assembly language you need 64
>bit numbers, in gcc you can get those by declaring them as "long long
>int" and do all you arithmetic and shifting on 64 bits values.
>
>You might want to read: http://gameprogrammer.com/4-fixed.html which has
>a nice section on fixed point arithmetic.
>
>BTW, why are you working with fixed point? Floating point arithmetic is
>much faster than integer arithmetic. Unless, of course, you are working
>on a machine with no floating point unit or are using a very old
>computer, something like a 486 or older.
>
>               Bob Pendleton
>
>  >
>  > Thanks.
>  >
>  > Gautam
>  >
>  > _________________________________________________________________
>  > Protect your PC from viruses. Enrich your online experience.
>  > http://www.msn.co.in/security/ Get more from the internet.
>  >
>  >
>  >
>  > ---------------------
>  > To unsubscribe go to http://gameprogrammer.com/mailinglist.html
>  >
>--
>+--------------------------------------+
>+ Bob Pendleton: writer and programmer +
>+ email: Bob@xxxxxxxxxxxxx             +
>+ blog:  www.Stonewolf.net             +
>+ web:   www.GameProgrammer.com        +
>+--------------------------------------+
>
>

_________________________________________________________________
Movies, music, celeb news. Stay in the loop. http://www.msn.co.in/cinema/ 
With MSN Entertainment!



---------------------
To unsubscribe go to http://gameprogrammer.com/mailinglist.html


Other related posts: