9 #include "CLHEP/Random/DoubConv.h"
16 bool DoubConv::byte_order_known =
false;
17 int DoubConv::byte_order[8];
19 void DoubConv::fill_byte_order () {
28 for (
int k=0; k<6; k++) {
41 static const int UNSET = -1;
43 byte_order[
n] = UNSET;
73 throw DoubConvException(
74 "Cannot determine byte-ordering of doubles on this system");
76 if (byte_order[n] != UNSET) {
77 throw DoubConvException(
78 "Confusion in byte-ordering of doubles on this system");
80 byte_order[
n] = order;
81 byte_order_known =
true;
86 std::string DoubConv::d2x(
double d) {
87 if ( !byte_order_known ) fill_byte_order ();
90 std::ostringstream ss;
91 for (
int i=0; i<8; ++i) {
92 int k = byte_order[i];
93 ss << std::hex << std::setw(2) << std::setfill(
'0') << (int)db.b[k];
98 std::vector<unsigned long> DoubConv::dto2longs(
double d) {
99 std::vector<unsigned long> v(2);
100 if ( !byte_order_known ) fill_byte_order ();
103 v[0] = ((
static_cast<unsigned long>(db.b[byte_order[0]])) << 24)
104 | ((static_cast<unsigned long>(db.b[byte_order[1]])) << 16)
105 | ((
static_cast<unsigned long>(db.b[byte_order[2]])) << 8)
106 | ((static_cast<unsigned long>(db.b[byte_order[3]])) );
107 v[1] = ((
static_cast<unsigned long>(db.b[byte_order[4]])) << 24)
108 | ((static_cast<unsigned long>(db.b[byte_order[5]])) << 16)
109 | ((
static_cast<unsigned long>(db.b[byte_order[6]])) << 8)
110 | ((static_cast<unsigned long>(db.b[byte_order[7]])) );
114 double DoubConv::longs2double (
const std::vector<unsigned long> & v) {
116 unsigned char bytes[8];
117 if ( !byte_order_known ) fill_byte_order ();
118 bytes[0] =
static_cast<unsigned char>((v[0] >> 24) & 0xFF);
119 bytes[1] =
static_cast<unsigned char>((v[0] >> 16) & 0xFF);
120 bytes[2] =
static_cast<unsigned char>((v[0] >> 8) & 0xFF);
121 bytes[3] =
static_cast<unsigned char>((v[0] ) & 0xFF);
122 bytes[4] =
static_cast<unsigned char>((v[1] >> 24) & 0xFF);
123 bytes[5] =
static_cast<unsigned char>((v[1] >> 16) & 0xFF);
124 bytes[6] =
static_cast<unsigned char>((v[1] >> 8) & 0xFF);
125 bytes[7] =
static_cast<unsigned char>((v[1] ) & 0xFF);
126 for (
int i=0; i<8; ++i) {
127 db.b[byte_order[i]] = bytes[i];