[Back to MATH SWAG index] [Back to Main SWAG index] [Original]

    (*

        This unit has been typed from the top of my head, so test
        it first with the examples in my previous message to Eli.
        As a matter of fact, this is a Unit that is based upon
        my explanations to Eli, so it somewhat NEEDS it ;)

        But I tested it though, just before posting it ;)

        This unit may be published in the next SWAGs (at least I
        think something like this belongs at least in the MISC SWAG
        becos it doesn't have one yet (I think).)
        but include the other mail too! (the previous one)

        If any questions, direct them to

        Gongo/Insecabilis
           dsmits@zorro.ruca.ua.ac.be
        or 2:292/8013.12 (fido)
    *)

        Unit FixP;

        {
            (c) 1996 by Dimitri Smits aka Gongo/Insecabilis
            Released to the public Domain on june 22 '96
            You may use this in any production you want
            just notice me of the result, always happy to
            see such stuff ;) ... not needed to credit me,
            just greet me (either in the documentation or
            in the demo/game/softpackage ;)
        }

        INTERFACE

        TYPE fp = LONGINT;
            { 16.16 fixed point, signed
                So all numbers -32768.0000 <= x < 32767.9999
                should be sufficiently supported (although mul             and div
    might lose some precision, or give odd results            for large numbers
    (integer part)}
        FUNCTION fp_add ( fp1,fp2: fp): fp;
        { Not really needed, but when going to
          overloading functions in C++ or so, this method is needed ;)
         in other words, just here to make things complete }
        { an fp3 := fp1 + fp2  is enough :) }

        FUNCTION fp_sub ( fp1,fp2: fp): fp;
       { same as with fp_add, only + is - now }

        FUNCTION fp_mul ( fp1,fp2: fp): fp;
        FUNCTION fp_div ( fp1,fp2: fp): fp;

        FUNCTION fp2float (fpt : fp) : REAL;
        FUNCTION float2fp (fl : REAL) : fp;

        IMPLEMENTATION

        FUNCTION fp_add (fp1,fp2 : fp) : fp;
            BEGIN
               fp_add := fp1 + fp2;
            END;

        FUNCTION fp_sub (fp1,fp2 : fp) : fp;
            BEGIN
               fp_sub := fp1 - fp2;
            END;

        FUNCTION fp_mul (fp1,fp2 : fp) : fp;
            BEGIN
                 IF abs(fp1) > abs(fp2) THEN
                   fp_mul := (fp1 SHR 8 * fp2) SHR 8
                 ELSE
                   fp_mul := (fp2 SHR 8 * fp1) SHR 8;
                {16-bit precision needed, not 32 =)}
            END;

        FUNCTION fp_div (fp1,fp2 :fp) : fp;
            BEGIN
                fp_div := (fp1 SHL 8) DIV (fp2 SHR 8);
                { May lose some precision there}
            END;

        FUNCTION fp2Float (fpt : fp) : REAL;
            BEGIN
                fp2Float := fpt / 65536;
            END;

        FUNCTION float2fp (fl : REAL) : fp;
            BEGIN
                float2fp := ROUND (fl * 65536);
            END;

    BEGIN
    END.

[Back to MATH SWAG index] [Back to Main SWAG index] [Original]