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

Matrix/CLHEP/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
8namespace CLHEP {
9
10class DoubConvException : public std::exception {
11public:
12 DoubConvException(const std::string & w) throw() : msg(w) {}
13 ~DoubConvException() throw() {}
14 const char* what() const throw() { return msg.c_str(); }
15private:
16 std::string msg;
17};
18
19class DoubConv {
20public:
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
44private:
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
static double longs2double(const std::vector< unsigned long > &v)
Definition DoubConv.cc:106
static std::vector< unsigned long > dto2longs(double d)
Definition DoubConv.cc:90
static std::string d2x(double d)
Definition DoubConv.cc:78