OR-Tools  8.1
accurate_sum.h
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 #ifndef OR_TOOLS_BASE_ACCURATE_SUM_H_
15 #define OR_TOOLS_BASE_ACCURATE_SUM_H_
16 
17 namespace operations_research {
18 
19 // Kahan summation compensation algorithm.
20 //
21 // http://en.wikipedia.org/wiki/Kahan_summation_algorithm
22 template <typename FpNumber>
23 class AccurateSum {
24  public:
25  // You may copy-construct an AccurateSum.
26  AccurateSum() : sum_(), error_sum_() {}
27 
28  // Adds an FpNumber to the sum.
29  void Add(const FpNumber& value) {
30  error_sum_ += value;
31  const FpNumber new_sum = sum_ + error_sum_;
32  error_sum_ += sum_ - new_sum;
33  sum_ = new_sum;
34  }
35 
36  // Gets the value of the sum.
37  FpNumber Value() const { return sum_; }
38 
39  private:
40  FpNumber sum_;
41  FpNumber error_sum_;
42 };
43 
44 } // namespace operations_research
45 
46 #endif // OR_TOOLS_BASE_ACCURATE_SUM_H_
operations_research::AccurateSum::Add
void Add(const FpNumber &value)
Definition: accurate_sum.h:29
value
int64 value
Definition: demon_profiler.cc:43
operations_research
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Definition: dense_doubly_linked_list.h:21
operations_research::AccurateSum::Value
FpNumber Value() const
Definition: accurate_sum.h:37
operations_research::AccurateSum::AccurateSum
AccurateSum()
Definition: accurate_sum.h:26
operations_research::AccurateSum
Definition: accurate_sum.h:23