61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
typedef long Word;
|
|
typedef unsigned long Single;
|
|
typedef struct {
|
|
unsigned long l;
|
|
unsigned long h;
|
|
} Double;
|
|
|
|
enum {
|
|
FractBits = 28,
|
|
CarryBit = 0x10000000,
|
|
HiddenBit = 0x08000000,
|
|
MsBit = HiddenBit,
|
|
NGuardBits = 3,
|
|
GuardMask = 0x07,
|
|
LsBit = (1<<NGuardBits),
|
|
|
|
SingleExpBias = 127,
|
|
SingleExpMax = 255,
|
|
DoubleExpBias = 1023,
|
|
DoubleExpMax = 2047,
|
|
|
|
ExpBias = DoubleExpBias,
|
|
ExpInfinity = DoubleExpMax,
|
|
};
|
|
|
|
typedef struct {
|
|
unsigned char s;
|
|
short e;
|
|
long l; /* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */
|
|
long h; /* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */
|
|
} Internal;
|
|
|
|
#define IsWeird(n) ((n)->e >= ExpInfinity)
|
|
#define IsInfinity(n) (IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0)
|
|
#define SetInfinity(n) ((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0)
|
|
#define IsNaN(n) (IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l))
|
|
#define SetQNaN(n) ((n)->s = 0, (n)->e = ExpInfinity, \
|
|
(n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
|
|
#define IsZero(n) ((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
|
|
#define SetZero(n) ((n)->e = 1, (n)->h = 0, (n)->l = 0)
|
|
|
|
/*
|
|
* fpi.c
|
|
*/
|
|
extern void fpiround(Internal *);
|
|
extern void fpiadd(Internal *, Internal *, Internal *);
|
|
extern void fpisub(Internal *, Internal *, Internal *);
|
|
extern void fpimul(Internal *, Internal *, Internal *);
|
|
extern void fpidiv(Internal *, Internal *, Internal *);
|
|
extern int fpicmp(Internal *, Internal *);
|
|
extern void fpinormalise(Internal*);
|
|
|
|
/*
|
|
* fpimem.c
|
|
*/
|
|
extern void fpis2i(Internal *, void *);
|
|
extern void fpid2i(Internal *, void *);
|
|
extern void fpiw2i(Internal *, void *);
|
|
extern void fpii2s(void *, Internal *);
|
|
extern void fpii2d(void *, Internal *);
|
|
extern void fpii2w(Word *, Internal *);
|