![]() |
HepPDT Reference DocumentationHepPDT |
00001 // ---------------------------------------------------------------------- 00002 // 00003 // Measurement.icc 00004 // author: Mark Fischler 00005 // ---------------------------------------------------------------------- 00006 00007 #include <algorithm> // swap() 00008 00009 namespace HepPDT { 00010 00011 inline double NaN() { 00012 // A byte-order-independent way to return a non-signalling NaN 00013 struct Dib { 00014 union { 00015 double d; 00016 int i[2]; 00017 } u; 00018 }; 00019 Dib pos3_2; 00020 Dib posTwo; 00021 pos3_2.u.d = 1.5; // Leading bit of mantissa = 1 --> quiet NaN 00022 posTwo.u.d = 2.0; 00023 Dib value; 00024 value.u.i[0] = pos3_2.u.i[0] | posTwo.u.i[0]; 00025 value.u.i[1] = pos3_2.u.i[1] | posTwo.u.i[1]; 00026 return value.u.d; 00027 } 00028 00029 00030 Measurement::Measurement ( double value, double sigma ) : 00031 val(value), sig(sigma) {} 00032 00033 Measurement::Measurement () : val(NaN()), sig(NaN()) {} 00034 00035 Measurement::Measurement ( const Measurement &m ) : 00036 val( m.val ), sig( m.sig ) {} 00037 00038 void Measurement::swap( Measurement & other ) 00039 { 00040 std::swap( val, other.val ); 00041 std::swap( sig, other.sig ); 00042 } 00043 00044 Measurement& Measurement::operator = ( Measurement const & rhs ) 00045 { 00046 Measurement temp( rhs ); 00047 swap( temp ); 00048 return *this; 00049 } 00050 00051 bool Measurement::operator < ( Measurement const & other ) const 00052 { 00053 return val < other.val; 00054 } 00055 00056 bool Measurement::operator == ( Measurement const & other ) const 00057 { 00058 return val == other.val; 00059 } 00060 00061 double Measurement::value() const { return val; } 00062 double Measurement::sigma() const { return sig; } 00063 00064 Measurement::operator double() const { return value(); } 00065 00066 00067 } // HepPDT