Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef math_private_h
00018 #define math_private_h
00019
00020 #include <sys/types.h>
00021
00022 namespace edm {
00023 namespace math_private {
00024
00025
00026 typedef union
00027 {
00028 float value;
00029 u_int32_t word;
00030 } ieee_float_shape_type;
00031
00032
00033 typedef union
00034 {
00035 double value;
00036 struct
00037 {
00038 u_int32_t lsw;
00039 u_int32_t msw;
00040 } parts;
00041 } ieee_double_shape_type;
00042
00043
00044 typedef union
00045 {
00046 long double value;
00047 struct
00048 {
00049 u_int32_t lsw;
00050 u_int32_t msw;
00051 int sign_exponent:16;
00052 unsigned int empty:16;
00053
00054 } parts;
00055 } ieee_long_double_shape_type;
00056
00057
00058 #define GET_FLOAT_WORD(i,d) \
00059 do { \
00060 edm::math_private::ieee_float_shape_type gf_u; \
00061 gf_u.value = (d); \
00062 (i) = gf_u.word; \
00063 } while (0)
00064
00065
00066 #define EXTRACT_WORDS(ix0,ix1,d) \
00067 do { \
00068 edm::math_private::ieee_double_shape_type ew_u; \
00069 ew_u.value = (d); \
00070 (ix0) = ew_u.parts.msw; \
00071 (ix1) = ew_u.parts.lsw; \
00072 } while (0)
00073
00074
00075 #define GET_LDOUBLE_WORDS(exp,ix0,ix1,d) \
00076 do { \
00077 edm::math_private::ieee_long_double_shape_type ew_u; \
00078 ew_u.value = (d); \
00079 (exp) = ew_u.parts.sign_exponent; \
00080 (ix0) = ew_u.parts.msw; \
00081 (ix1) = ew_u.parts.lsw; \
00082 } while (0)
00083
00084 }
00085 }
00086
00087 #endif // math_private_h