CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

Random/Random/DoubConv.hh
Go to the documentation of this file.
1 #ifndef DOUBCONV_HH
2 #define DOUBCONV_HH
3 
4 #include <string>
5 #include <vector>
6 #include <exception>
7 
8 namespace CLHEP {
9 
10 class DoubConvException : public std::exception {
11 public:
12  DoubConvException(const std::string & w) throw() : msg(w) {}
13  ~DoubConvException() throw() {}
14  const char* what() const throw() { return msg.c_str(); }
15 private:
16  std::string msg;
17 };
18 
19 class DoubConv {
20 public:
21 
22  // dto2longs(d) returns (in a vector) two unsigned longs string containing the
23  // representation of its double input. This is byte-ordering
24  // independant, and depends for complete portability ONLY on adherance
25  // to the IEEE 754 standard for 64-bit floating point representation.
26  // The first unsigned long contains the high-order bits in IEEE; thus
27  // 1.0 will always be 0x3FF00000, 00000000
28  static std::vector<unsigned long> dto2longs(double d);
29 
30  // longs2double (v) returns a double containing the value represented by its
31  // input, which must be a vector containing 2 unsigned longs.
32  // The input is taken to be the representation according to
33  // the IEEE 754 standard for a 64-bit floating point number, whose value
34  // is returned as a double. The byte-ordering of the double result is,
35  // of course, tailored to the proper byte-ordering for the system.
36  static double longs2double (const std::vector<unsigned long> & v);
37 
38  // dtox(d) returns a 16-character string containing the (zero-filled) hex
39  // representation of its double input. This is byte-ordering
40  // independant, and depends for complete portability ONLY on adherance
41  // to the IEEE 754 standard for 64-bit floating point representation.
42  static std::string d2x(double d);
43 
44 private:
45  union DB8 {
46  unsigned char b[8];
47  double d;
48  };
49  static void fill_byte_order ();
50  static bool byte_order_known;
51  static int byte_order[8];
52  // Meaning of byte_order: The first (high-order in IEEE 754) byte to
53  // output (or the high-order byte of the first unsigned long)
54  // is of db.b[byte_order[0]]. Thus the index INTO byte_order
55  // is a position in the IEEE representation of the double, and the value
56  // of byte_order[k] is an offset in the memory representation of the
57  // double.
58 };
59 
60 
61 }
62 
63 #endif // DOUBCONV_HH