1*d6dfd9efSDavid du Colombier typedef long Word; 2*d6dfd9efSDavid du Colombier typedef unsigned long Single; 3*d6dfd9efSDavid du Colombier typedef struct { 4*d6dfd9efSDavid du Colombier unsigned long h; 5*d6dfd9efSDavid du Colombier unsigned long l; 6*d6dfd9efSDavid du Colombier } Double; 7*d6dfd9efSDavid du Colombier 8*d6dfd9efSDavid du Colombier enum { 9*d6dfd9efSDavid du Colombier FractBits = 28, 10*d6dfd9efSDavid du Colombier CarryBit = 0x10000000, 11*d6dfd9efSDavid du Colombier HiddenBit = 0x08000000, 12*d6dfd9efSDavid du Colombier MsBit = HiddenBit, 13*d6dfd9efSDavid du Colombier NGuardBits = 3, 14*d6dfd9efSDavid du Colombier GuardMask = 0x07, 15*d6dfd9efSDavid du Colombier LsBit = (1<<NGuardBits), 16*d6dfd9efSDavid du Colombier 17*d6dfd9efSDavid du Colombier SingleExpBias = 127, 18*d6dfd9efSDavid du Colombier SingleExpMax = 255, 19*d6dfd9efSDavid du Colombier DoubleExpBias = 1023, 20*d6dfd9efSDavid du Colombier DoubleExpMax = 2047, 21*d6dfd9efSDavid du Colombier 22*d6dfd9efSDavid du Colombier ExpBias = DoubleExpBias, 23*d6dfd9efSDavid du Colombier ExpInfinity = DoubleExpMax, 24*d6dfd9efSDavid du Colombier }; 25*d6dfd9efSDavid du Colombier 26*d6dfd9efSDavid du Colombier typedef struct { 27*d6dfd9efSDavid du Colombier unsigned char s; 28*d6dfd9efSDavid du Colombier short e; 29*d6dfd9efSDavid du Colombier long l; /* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */ 30*d6dfd9efSDavid du Colombier long h; /* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */ 31*d6dfd9efSDavid du Colombier } Internal; 32*d6dfd9efSDavid du Colombier 33*d6dfd9efSDavid du Colombier #define IsWeird(n) ((n)->e >= ExpInfinity) 34*d6dfd9efSDavid du Colombier #define IsInfinity(n) (IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0) 35*d6dfd9efSDavid du Colombier #define SetInfinity(n) ((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0) 36*d6dfd9efSDavid du Colombier #define IsNaN(n) (IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l)) 37*d6dfd9efSDavid du Colombier #define SetQNaN(n) ((n)->s = 0, (n)->e = ExpInfinity, \ 38*d6dfd9efSDavid du Colombier (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0) 39*d6dfd9efSDavid du Colombier #define IsZero(n) ((n)->e == 1 && (n)->h == 0 && (n)->l == 0) 40*d6dfd9efSDavid du Colombier #define SetZero(n) ((n)->e = 1, (n)->h = 0, (n)->l = 0) 41*d6dfd9efSDavid du Colombier 42*d6dfd9efSDavid du Colombier /* 43*d6dfd9efSDavid du Colombier * fpi.c 44*d6dfd9efSDavid du Colombier */ 45*d6dfd9efSDavid du Colombier extern void fpiround(Internal *); 46*d6dfd9efSDavid du Colombier extern void fpiadd(Internal *, Internal *, Internal *); 47*d6dfd9efSDavid du Colombier extern void fpisub(Internal *, Internal *, Internal *); 48*d6dfd9efSDavid du Colombier extern void fpimul(Internal *, Internal *, Internal *); 49*d6dfd9efSDavid du Colombier extern void fpidiv(Internal *, Internal *, Internal *); 50*d6dfd9efSDavid du Colombier extern int fpicmp(Internal *, Internal *); 51*d6dfd9efSDavid du Colombier extern void fpinormalise(Internal*); 52*d6dfd9efSDavid du Colombier 53*d6dfd9efSDavid du Colombier /* 54*d6dfd9efSDavid du Colombier * fpimem.c 55*d6dfd9efSDavid du Colombier */ 56*d6dfd9efSDavid du Colombier extern void fpis2i(Internal *, void *); 57*d6dfd9efSDavid du Colombier extern void fpid2i(Internal *, void *); 58*d6dfd9efSDavid du Colombier extern void fpiw2i(Internal *, void *); 59*d6dfd9efSDavid du Colombier extern void fpii2s(void *, Internal *); 60*d6dfd9efSDavid du Colombier extern void fpii2d(void *, Internal *); 61*d6dfd9efSDavid du Colombier extern void fpii2w(Word *, Internal *); 62