summaryrefslogtreecommitdiff
path: root/libm/fp_private.h
blob: 30b3e05725f617bc8e5dbea7dee956474ef75707 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*******************************************************************************
*                                                                              *
*      File fp_private.h,                                                      *
*      All pack 4 dependencies for the MathLib elems plus some defines used    *
*      throughout MathLib.                                                     *
*                                                                              *
*      Copyright © 1991 Apple Computer, Inc.  All rights reserved.             *
*                                                                              *
*      Written by Ali Sazegari, started on October 1991,                       *
*                                                                              *
*      W A R N I N G:  This routine expects a 64 bit double model.             *
*                                                                              *
*******************************************************************************/

#define      NoException            0

/*******************************************************************************
*                              Values of constants.                            *
*******************************************************************************/

//#define    SgnMask            0x8000
#define      dSgnMask           0x80000000
#define      sSgnMask           0x7FFFFFFF

//#define    ExpMask            0x7FFF
#define      dExpMask           0x7FF00000
#define      sExpMask           0xFF000000

                                          /* according to rounding BIG & SMALL are:  */
#define      BIG               1.1e+300   /* used to deliver ±° or largest number,   */
#define      SMALL             1.1e-300   /* used to deliver ±0 or smallest number.  */
#define      InfExp            0x7FF
#define      dMaxExp           0x7FF00000

#define      MaxExpP1          1024
#define      MaxExp            1023

#define      DenormLimit       -52

//#define    ManMask           0x80000000
#define      dManMask          0x00080000

//#define    IsItDenorm         0x80000000
#define      dIsItDenorm        0x00080000

//#define    xIsItSNaN          0x40000000
#define      dIsItSNaN          0x00080000

#define      dHighMan           0x000FFFFF
#define      dFirstBitSet       0x00080000
#define      BIAS               0x3FF

//#define    GetSign            0x8000
#define      dGetSign           0x80000000
#define      sGetSign           0x80000000

//#define    Infinity(x)       ( x.hex.exponent & ExpMask ) == ExpMask
#define      dInfinity(x)      ( x.hex.high & dExpMask ) == dExpMask
#define      sInfinity(x)      ( ( x.hexsgl << 1 ) & sExpMask ) == sExpMask      

//#define    Exponent(x)       x.hex.exponent & ExpMask
#define      dExponent(x)      x.hex.high & dExpMask
#define      sExponent(x)      ( ( x.hexsgl << 1 ) & sExpMask )

#define      sZero(x)          ( x.hexsgl & sSgnMask ) == 0 
//#define    Sign(x)           ( x.hex.exponent & SgnMask ) == SgnMask

/*******************************************************************************
*                        Types used in the auxiliary functions.                *
*******************************************************************************/

typedef struct                   /*      Hex representation of a double.      */
      {
#if defined(__BIG_ENDIAN__)
      unsigned long int high;
      unsigned long int low;
#else
      unsigned long int low;
      unsigned long int high;
#endif
      } dHexParts;

typedef union
      {
      unsigned char byties[8];
      double dbl;
      } DblInHex;

//enum boolean { FALSE, TRUE };

/*******************************************************************************
*       Macros to access long subfields of a double value.                     *
*******************************************************************************/

#define highpartd(x) *((long *) &x)
#define lowpartd(x)  *((long *) &x + 1)

enum {
  FP_SNAN                       = 0,    /*      signaling NaN
      */
  FP_QNAN                       = 1,    /*      quiet NaN
      */
  FP_INFINITE                   = 2,    /*      + or - infinity
      */ 
  FP_ZERO                       = 3,    /*      + or - zero
      */
  FP_NORMAL                     = 4,    /*      all normal numbers 
      */
  FP_SUBNORMAL                  = 5     /*      denormal numbers 
      */
};