00001
00051 #ifndef _EPD
00052 #define _EPD
00053
00054 #ifdef __cplusplus
00055 extern "C" {
00056 #endif
00057
00058
00059
00060
00061
00062 #define EPD_MAX_BIN 1023
00063 #define EPD_MAX_DEC 308
00064 #define EPD_EXP_INF 0x7ff
00065
00066
00067
00068
00069
00079 #ifdef EPD_BIG_ENDIAN
00080 struct IeeeDoubleStruct {
00081 unsigned int sign: 1;
00082 unsigned int exponent: 11;
00083 unsigned int mantissa0: 20;
00084 unsigned int mantissa1: 32;
00085 };
00086 #else
00087 struct IeeeDoubleStruct {
00088 unsigned int mantissa1: 32;
00089 unsigned int mantissa0: 20;
00090 unsigned int exponent: 11;
00091 unsigned int sign: 1;
00092 };
00093 #endif
00094
00104 #ifdef EPD_BIG_ENDIAN
00105 struct IeeeNanStruct {
00106 unsigned int sign: 1;
00107 unsigned int exponent: 11;
00108 unsigned int quiet_bit: 1;
00109 unsigned int mantissa0: 19;
00110 unsigned int mantissa1: 32;
00111 };
00112 #else
00113 struct IeeeNanStruct {
00114 unsigned int mantissa1: 32;
00115 unsigned int mantissa0: 19;
00116 unsigned int quiet_bit: 1;
00117 unsigned int exponent: 11;
00118 unsigned int sign: 1;
00119 };
00120 #endif
00121
00131 union EpTypeUnion {
00132 double value;
00133 struct IeeeDoubleStruct bits;
00134 struct IeeeNanStruct nan;
00135 };
00136
00137 struct EpDoubleStruct {
00138 union EpTypeUnion type;
00139 int exponent;
00140 };
00141
00142
00143
00144
00145 typedef struct EpDoubleStruct EpDouble;
00146 typedef struct IeeeDoubleStruct IeeeDouble;
00147 typedef struct IeeeNanStruct IeeeNan;
00148 typedef union EpTypeUnion EpType;
00149
00152
00153
00154
00155
00156 extern EpDouble *EpdAlloc(void);
00157 extern int EpdCmp(const char *key1, const char *key2);
00158 extern void EpdFree(EpDouble *epd);
00159 extern void EpdGetString(EpDouble *epd, char *str);
00160 extern void EpdConvert(double value, EpDouble *epd);
00161 extern void EpdMultiply(EpDouble *epd1, double value);
00162 extern void EpdMultiply2(EpDouble *epd1, EpDouble *epd2);
00163 extern void EpdMultiply2Decimal(EpDouble *epd1, EpDouble *epd2);
00164 extern void EpdMultiply3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3);
00165 extern void EpdMultiply3Decimal(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3);
00166 extern void EpdDivide(EpDouble *epd1, double value);
00167 extern void EpdDivide2(EpDouble *epd1, EpDouble *epd2);
00168 extern void EpdDivide3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3);
00169 extern void EpdAdd(EpDouble *epd1, double value);
00170 extern void EpdAdd2(EpDouble *epd1, EpDouble *epd2);
00171 extern void EpdAdd3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3);
00172 extern void EpdSubtract(EpDouble *epd1, double value);
00173 extern void EpdSubtract2(EpDouble *epd1, EpDouble *epd2);
00174 extern void EpdSubtract3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3);
00175 extern void EpdPow2(int n, EpDouble *epd);
00176 extern void EpdPow2Decimal(int n, EpDouble *epd);
00177 extern void EpdNormalize(EpDouble *epd);
00178 extern void EpdNormalizeDecimal(EpDouble *epd);
00179 extern void EpdGetValueAndDecimalExponent(EpDouble *epd, double *value, int *exponent);
00180 extern int EpdGetExponent(double value);
00181 extern int EpdGetExponentDecimal(double value);
00182 extern void EpdMakeInf(EpDouble *epd, int sign);
00183 extern void EpdMakeZero(EpDouble *epd, int sign);
00184 extern void EpdMakeNan(EpDouble *epd);
00185 extern void EpdCopy(EpDouble *from, EpDouble *to);
00186 extern int EpdIsInf(EpDouble *epd);
00187 extern int EpdIsZero(EpDouble *epd);
00188 extern int EpdIsNan(EpDouble *epd);
00189 extern int EpdIsNanOrInf(EpDouble *epd);
00190 extern int IsInfDouble(double value);
00191 extern int IsNanDouble(double value);
00192 extern int IsNanOrInfDouble(double value);
00193
00196 #ifdef __cplusplus
00197 }
00198 #endif
00199
00200 #endif