Merge "Better solution for Docomo 1339 bug." into tizen_2.1
[framework/web/webkit-efl.git] / Source / WTF / wtf / SimpleStats.h
1 /*
2  * Copyright (C) 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef SimpleStats_h
27 #define SimpleStats_h
28
29 #include <wtf/MathExtras.h>
30 #include <wtf/StdLibExtras.h>
31
32 namespace WTF {
33
34 // Simple and cheap way of tracking statistics if you're not worried about chopping on
35 // the sum of squares (i.e. the sum of squares is unlikely to exceed 2^52).
36 class SimpleStats {
37 public:
38     SimpleStats()
39         : m_count(0)
40         , m_sum(0)
41         , m_sumOfSquares(0)
42     {
43     }
44     
45     void add(double value)
46     {
47         m_count++;
48         m_sum += value;
49         m_sumOfSquares += value * value;
50     }
51     
52     bool operator!() const
53     {
54         return !m_count;
55     }
56     
57     double count() const
58     {
59         return m_count;
60     }
61     
62     double sum() const
63     {
64         return m_sum;
65     }
66     
67     double sumOfSquares() const
68     {
69         return m_sumOfSquares;
70     }
71     
72     double mean() const
73     {
74         return m_sum / m_count;
75     }
76     
77     // NB. This gives a biased variance as it divides by the number of samples rather
78     // than the degrees of freedom. This is fine once the count grows large, which in
79     // our case will happen rather quickly.
80     double variance() const
81     {
82         if (m_count < 2)
83             return 0;
84         
85         // Compute <x^2> - <x>^2
86         double secondMoment = m_sumOfSquares / m_count;
87         double firstMoment = m_sum / m_count;
88         
89         double result = secondMoment - firstMoment * firstMoment;
90         
91         // It's possible to get -epsilon. Protect against this and turn it into
92         // +0.
93         if (result <= 0)
94             return 0;
95         
96         return result;
97     }
98     
99     // NB. This gives a biased standard deviation. See above.
100     double standardDeviation() const
101     {
102         return sqrt(variance());
103     }
104     
105 private:
106     double m_count;
107     double m_sum;
108     double m_sumOfSquares;
109 };
110
111 } // namespace WTF
112
113 #endif // SimpleStats_h
114