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