[ros-dev] revision 26772, Mon May 14 03:18:42 2007 UTC
Timo Kreuzer
timo.kreuzer at web.de
Wed May 16 21:44:03 CEST 2007
It should probably be
+ Exp -= (1 - EXCESS);
in EFtoF() and
+ Exp += (1 - EXCESS);
in FtoEF(). The other way round.
Suggestion to make it a little clearer:
#define BIAS 127
Exp -+= (BIAS - 2);
jimtabor wrote:
> --- trunk/reactos/dll/win32/gdi32/objects/painting.c 2006/12/28 22:36:53 25235
> +++ trunk/reactos/dll/win32/gdi32/objects/painting.c 2007/05/14 03:18:42 26772
> @@ -1,15 +1,66 @@
>
[...]
> +/* the following deal with IEEE single-precision numbers */
> +#define EXCESS 126L
> +#define SIGNBIT 0x80000000L
> +#define SIGN(fp) ((fp) & SIGNBIT)
> +#define EXP(fp) (((fp) >> 23L) & 0xFF)
> +#define MANT(fp) ((fp) & 0x7FFFFFL)
> +#define PACK(s,e,m) ((s) | ((e) << 23L) | (m))
>
[...]
> +LONG
> +FASTCALL
> +EFtoF( EFLOAT_S * efp)
> +{
> + long Mant, Exp, Sign = 0;
> +
> + if (!efp->lMant) return 0;
> +
> + Mant = efp->lMant;
> + Exp = efp->lExp;
> + Sign = SIGN(Mant);
> +
> +//// M$ storage emulation
> + Mant = ((Mant & 0x3fffffff) >> 7);
> + Exp += (1 - EXCESS);
> +////
> + Mant = MANT(Mant);
> + return PACK(Sign, Exp, Mant);
> +}
> +
> +VOID
> +FASTCALL
> +FtoEF( EFLOAT_S * efp, FLOATL f)
> +{
> + long Mant, Exp;
> + gxf_long worker;
> +
> +#ifdef _X86_
> + worker.l = f; // It's a float stored in a long.
> +#else
> + worker.f = f;
> +#endif
> +
> + Exp = EXP(worker.l);
> + Mant = MANT(worker.l);
> +
> +//// M$ storage emulation
> + Mant = ((Mant << 7) | 0x40000000 | SIGN(worker.l));
> + Exp -= (1 - EXCESS);
> +////
> + efp->lMant = Mant;
> + efp->lExp = Exp;
> +}
>
More information about the Ros-dev
mailing list