ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/System8/s8/Stat/src/Measurements.cpp
Revision: 1.1
Committed: Fri May 6 14:36:22 2011 UTC (14 years ago) by samvel
Branch: MAIN
CVS Tags: melo-old
Log Message:
Import Stat

File Contents

# User Rev Content
1 samvel 1.1 /**
2     * Measurement
3     * s8
4     *
5     * Created by Samvel Khalatian on Dec 20, 2010
6     * Copyright 2010, All rights reserved
7     */
8    
9     #include <cmath>
10    
11     #include <ostream>
12     #include <stdexcept>
13    
14     #include "Stat/interface/Measurement.h"
15    
16     using std::runtime_error;
17    
18     using s8::Measurement;
19    
20     Measurement::Measurement() throw():
21     _value(0),
22     _variance(0)
23     {
24     }
25    
26     Measurement::Measurement(const double &value, const double &variance) throw():
27     _value(value),
28     _variance(variance)
29     {
30     }
31    
32     double Measurement::value() const
33     {
34     return _value;
35     }
36    
37     double Measurement::variance() const
38     {
39     return _variance;
40     }
41    
42     void Measurement::setValue(const double &value)
43     {
44     _value = value;
45     }
46    
47     void Measurement::setVariance(const double &variance)
48     {
49     _variance = variance;
50     }
51    
52    
53    
54     // Helpers
55     //
56     std::ostream &s8::operator<<(std::ostream &out, const Measurement &m)
57     {
58     using std::ios_base;
59     using std::ios;
60    
61     const std::streamsize precision = out.precision(4);
62     const ios_base::fmtflags flags = out.flags(ios::fixed);
63    
64     const double sigma = sqrt(m.variance());
65    
66     out << m.value() << " +/- " << sigma;
67    
68     out.precision(2);
69     out << " (" << 100 * sigma / m.value() << "%)";
70    
71     out.flags(flags);
72     out.precision(precision);
73    
74     return out;
75     }
76    
77     // Simple logic
78     //
79     Measurement s8::operator +(const Measurement &m1, const Measurement &m2)
80     {
81     Measurement m = m1;
82    
83     m += m2;
84    
85     return m;
86     }
87    
88     Measurement s8::operator -(const Measurement &m1, const Measurement &m2)
89     {
90     Measurement m = m1;
91    
92     m -= m2;
93    
94     return m;
95     }
96    
97     Measurement s8::operator *(const Measurement &m1, const Measurement &m2)
98     {
99     Measurement m = m1;
100    
101     m *= m2;
102    
103     return m;
104     }
105    
106     Measurement s8::operator /(const Measurement &m1, const Measurement &m2)
107     {
108     Measurement m = m1;
109    
110     m /= m2;
111    
112     return m;
113     }
114    
115     Measurement s8::operator %(const Measurement &m1, const Measurement &m2)
116     {
117     Measurement m = m1;
118    
119     m %= m2;
120    
121     return m;
122     }
123    
124     // Shortcuts: no temporary variable is created
125     //
126     void s8::operator+=(Measurement &m1, const Measurement &m2)
127     {
128     m1.setValue(m1.value() + m2.value());
129     m1.setVariance(m1.variance() + m2.variance());
130     }
131    
132     void s8::operator-=(Measurement &m1, const Measurement &m2)
133     {
134     m1.setValue(m1.value() - m2.value());
135     m1.setVariance(m1.variance() + m2.variance());
136     }
137    
138     void s8::operator*=(Measurement &m1, const Measurement &m2)
139     {
140     m1.setValue(m1.value() * m2.value());
141     m1.setVariance(pow(m2.value(), 2) * m1.variance() +
142     pow(m1.value(), 2) * m2.variance());
143     }
144    
145     void s8::operator/=(Measurement &m1, const Measurement &m2)
146     {
147     if (0 == m2.value())
148     throw runtime_error("Failed to divide by null Measurement");
149    
150     m1.setValue(m1.value() / m2.value());
151     m1.setVariance(pow(1. / m2.value(), 2) * m1.variance() +
152     pow(m1.value() / pow(m2.value(), 2), 2) *
153     m2.variance());
154     }
155    
156     void s8::operator%=(Measurement &m1, const Measurement &m2)
157     {
158     if (0 == m2.value())
159     throw runtime_error("Failed to divide by null Measurement");
160    
161     const double ratio = m1.value() / m2.value();
162    
163     m1.setValue(ratio);
164     m1.setVariance(((1 - 2 * ratio) * m1.variance() +
165     pow(ratio, 2) * m2.variance()) / pow(m2.value(), 2));
166     }