00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "Measurement.h"
00032 #include <math.h>
00033 #include <ostream>
00034
00035 Measurement::Measurement() :
00036 m_value ( 0 ),
00037 m_variance( 0 ),
00038 m_sigma ( 0 )
00039 {
00040 }
00041
00042 Measurement::Measurement( double val, double var ) :
00043 m_value ( val ),
00044 m_variance( var ),
00045 m_sigma ( sqrt(var) )
00046 {
00047 }
00048
00049 Measurement::Measurement( unsigned long int val ) :
00050 m_value ( val ),
00051 m_variance( val ),
00052 m_sigma ( sqrt(val) )
00053 {
00054 }
00055
00056 Measurement::Measurement( const Measurement& m ) :
00057 m_value ( m.m_value ),
00058 m_variance( m.m_variance ),
00059 m_sigma ( m.m_sigma )
00060 {
00061 }
00062
00063 Measurement::~Measurement()
00064 {
00065 }
00066
00067 void
00068 Measurement::operator=( const Measurement& m )
00069 {
00070 if ( &m == this ) return;
00071
00072 m_value = m.m_value;
00073 m_variance = m.m_variance;
00074 m_sigma = m.m_sigma;
00075 }
00076
00077 Measurement
00078 Measurement::operator+( const Measurement& m ) const
00079 {
00080 double val = m_value + m.m_value;
00081 double var = m_variance + m.m_variance;
00082 return Measurement( val, var );
00083 }
00084
00085 Measurement
00086 Measurement::operator-( const Measurement& m ) const
00087 {
00088 double val = m_value - m.m_value;
00089 double var = m_variance + m.m_variance;
00090 return Measurement( val, var );
00091 }
00092
00093 Measurement
00094 Measurement::operator*( const Measurement& m ) const
00095 {
00096 double val = m_value * m.m_value;
00097 double x2 = m_value * m_value;
00098 double y2 = m.m_value * m.m_value;
00099 double var = y2 * m_variance + x2 * m.m_variance;
00100 return Measurement( val, var );
00101 }
00102
00103 Measurement
00104 Measurement::operator/( const Measurement& m ) const
00105 {
00106 double val = m_value / m.m_value;
00107 double y2 = m.m_value * m.m_value;
00108 double var = ( m_variance + val*val*m.m_variance ) / y2;
00109 return Measurement( val, var );
00110 }
00111
00112 bool
00113 Measurement::operator<( const Measurement& m ) const
00114 {
00115 return m_value < m.m_value;
00116 }
00117
00118 bool
00119 Measurement::operator>( const Measurement& m ) const
00120 {
00121 return m_value > m.m_value;
00122 }
00123
00124 std::ostream&
00125 operator<<(std::ostream& stream, const Measurement& m)
00126 {
00127 stream << m.value() << (char)177 << m.deviation();
00128 return stream;
00129 }