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