1540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera/*
2540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
5540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This code is free software; you can redistribute it and/or modify it
6540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * under the terms of the GNU General Public License version 2 only, as
7540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * published by the Free Software Foundation.  Oracle designates this
8540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * particular file as subject to the "Classpath" exception as provided
9540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * by Oracle in the LICENSE file that accompanied this code.
10540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
11540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT
12540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that
15540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * accompanied this code).
16540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
17540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * You should have received a copy of the GNU General Public License version
18540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation,
19540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
21540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * or visit www.oracle.com if you need additional information or have any
23540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * questions.
24540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */
25540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmerapackage java.util;
26540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
27540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmeraimport java.util.function.DoubleConsumer;
28540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
29540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera/**
30540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * A state object for collecting statistics such as count, min, max, sum, and
31540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * average.
32540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
33540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p>This class is designed to work with (though does not require)
3491bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@linkplain java.util.stream streams}. For example, you can compute
35540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * summary statistics on a stream of doubles with:
36540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <pre> {@code
37540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new,
38540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *                                                      DoubleSummaryStatistics::accept,
39540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *                                                      DoubleSummaryStatistics::combine);
40540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * }</pre>
41540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
42540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p>{@code DoubleSummaryStatistics} can be used as a
4391bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
4491bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * target for a {@linkplain java.util.stream.Stream stream}. For example:
45540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
46540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <pre> {@code
47540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics stats = people.stream()
48540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *     .collect(Collectors.summarizingDouble(Person::getWeight));
49540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *}</pre>
50540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
51540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This computes, in a single pass, the count of people, as well as the minimum,
52540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * maximum, sum, and average of their weights.
53540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *
54540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @implNote This implementation is not thread safe. However, it is safe to use
5591bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction)
56540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel
5791bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
58540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * provides the necessary partitioning, isolation, and merging of results for
59540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * safe and efficient parallel execution.
60540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @since 1.8
61540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */
62540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmerapublic class DoubleSummaryStatistics implements DoubleConsumer {
63540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private long count;
64540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private double sum;
65540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private double sumCompensation; // Low order bits of sum
66540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private double simpleSum; // Used to compute right sum for non-finite inputs
67540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private double min = Double.POSITIVE_INFINITY;
68540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private double max = Double.NEGATIVE_INFINITY;
69540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
70540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
71540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Construct an empty instance with zero count, zero sum,
72540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * {@code Double.POSITIVE_INFINITY} min, {@code Double.NEGATIVE_INFINITY}
73540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * max and zero average.
74540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
75540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public DoubleSummaryStatistics() { }
76540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
77540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
78540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Records another value into the summary information.
79540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
80540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @param value the input value
81540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
82540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    @Override
83540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public void accept(double value) {
84540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        ++count;
85540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        simpleSum += value;
86540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        sumWithCompensation(value);
87540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        min = Math.min(min, value);
88540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        max = Math.max(max, value);
89540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
90540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
91540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
92540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Combines the state of another {@code DoubleSummaryStatistics} into this
93540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * one.
94540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
95540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @param other another {@code DoubleSummaryStatistics}
96540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @throws NullPointerException if {@code other} is null
97540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
98540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public void combine(DoubleSummaryStatistics other) {
99540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        count += other.count;
100540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        simpleSum += other.simpleSum;
101540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        sumWithCompensation(other.sum);
102540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        sumWithCompensation(other.sumCompensation);
103540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        min = Math.min(min, other.min);
104540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        max = Math.max(max, other.max);
105540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
106540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
107540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
108540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Incorporate a new double value using Kahan summation /
109540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * compensated summation.
110540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
111540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    private void sumWithCompensation(double value) {
112540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        double tmp = value - sumCompensation;
113540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        double velvel = sum + tmp; // Little wolf of rounding error
114540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        sumCompensation = (velvel - sum) - tmp;
115540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        sum = velvel;
116540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
117540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
118540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
119540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Return the count of values recorded.
120540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
121540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @return the count of values
122540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
123540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public final long getCount() {
124540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        return count;
125540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
126540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
127540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
128540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Returns the sum of values recorded, or zero if no values have been
129540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * recorded.
130540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
131540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * If any recorded value is a NaN or the sum is at any point a NaN
132540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * then the sum will be NaN.
133540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
134540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * <p> The value of a floating-point sum is a function both of the
135540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * input values as well as the order of addition operations. The
136540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * order of addition operations of this method is intentionally
137540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * not defined to allow for implementation flexibility to improve
138540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * the speed and accuracy of the computed result.
139540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
140540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * In particular, this method may be implemented using compensated
141540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * summation or other technique to reduce the error bound in the
142540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * numerical sum compared to a simple summation of {@code double}
143540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * values.
144540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
145540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @apiNote Values sorted by increasing absolute magnitude tend to yield
146540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * more accurate results.
147540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
148540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @return the sum of values, or zero if none
149540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
150540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public final double getSum() {
151540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        // Better error bounds to add both terms as the final sum
152540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        double tmp =  sum + sumCompensation;
153540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        if (Double.isNaN(tmp) && Double.isInfinite(simpleSum))
154540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            // If the compensated sum is spuriously NaN from
155540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            // accumulating one or more same-signed infinite values,
156540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            // return the correctly-signed infinity stored in
157540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            // simpleSum.
158540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            return simpleSum;
159540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        else
160540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            return tmp;
161540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
162540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
163540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
164540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Returns the minimum recorded value, {@code Double.NaN} if any recorded
165540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were
166540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * recorded. Unlike the numerical comparison operators, this method
167540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * considers negative zero to be strictly smaller than positive zero.
168540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
169540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @return the minimum recorded value, {@code Double.NaN} if any recorded
170540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were
171540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * recorded
172540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
173540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public final double getMin() {
174540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        return min;
175540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
176540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
177540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
178540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Returns the maximum recorded value, {@code Double.NaN} if any recorded
179540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were
180540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * recorded. Unlike the numerical comparison operators, this method
181540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * considers negative zero to be strictly smaller than positive zero.
182540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
183540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @return the maximum recorded value, {@code Double.NaN} if any recorded
184540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were
185540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * recorded
186540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
187540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public final double getMax() {
188540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        return max;
189540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
190540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
191540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
192540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Returns the arithmetic mean of values recorded, or zero if no
193540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * values have been recorded.
194540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
195540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * If any recorded value is a NaN or the sum is at any point a NaN
196540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * then the average will be code NaN.
197540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
198540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * <p>The average returned can vary depending upon the order in
199540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * which values are recorded.
200540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
201540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * This method may be implemented using compensated summation or
202540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * other technique to reduce the error bound in the {@link #getSum
203540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * numerical sum} used to compute the average.
204540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
205540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @apiNote Values sorted by increasing absolute magnitude tend to yield
206540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * more accurate results.
207540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
208540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * @return the arithmetic mean of values, or zero if none
209540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
210540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public final double getAverage() {
211540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        return getCount() > 0 ? getSum() / getCount() : 0.0d;
212540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
213540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera
214540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    /**
215540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * {@inheritDoc}
216540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     *
217540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * Returns a non-empty string representation of this object suitable for
218540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * debugging. The exact presentation format is unspecified and may vary
219540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     * between implementations and versions.
220540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera     */
221540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    @Override
222540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    public String toString() {
223540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera        return String.format(
224540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            "%s{count=%d, sum=%f, min=%f, average=%f, max=%f}",
225540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            this.getClass().getSimpleName(),
226540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            getCount(),
227540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            getSum(),
228540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            getMin(),
229540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            getAverage(),
230540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera            getMax());
231540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera    }
232540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera}
233