ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/System8/s8/Stat/src/Measurements.cpp
Revision: 1.2
Committed: Tue May 24 13:56:16 2011 UTC (13 years, 11 months ago) by samvel
Branch: MAIN
CVS Tags: V00-00-04, V00-00-03, V00-00-02-04, V00-00-02-03, V00-00-02-02, V00-00-02-01, V00-00-02, HEAD
Changes since 1.1: +1 -1 lines
Log Message:
Convert Stat build system to scram

File Contents

# Content
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 "s8/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 }