fpi.h 1.6 KB

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