fixed some issues
added new pose/turn detections new helper classes define-flags for libEigen
This commit is contained in:
84
math/KahanSum.h
Normal file
84
math/KahanSum.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef KAHANSUM_H
|
||||
#define KAHANSUM_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
template <typename T> class KahanSum {
|
||||
|
||||
private:
|
||||
|
||||
const T zero;
|
||||
|
||||
/** current sum */
|
||||
T sum;
|
||||
|
||||
/** current compensation */
|
||||
T comp;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
/** ctor with zero element */
|
||||
KahanSum(const T zero) : zero(zero), sum(zero), comp(zero) {
|
||||
|
||||
}
|
||||
|
||||
KahanSum& operator += (const T val) {
|
||||
add(val);
|
||||
return *this;
|
||||
}
|
||||
|
||||
KahanSum& operator -= (const T val) {
|
||||
sub(val);
|
||||
return *this;
|
||||
}
|
||||
|
||||
T get() const {
|
||||
return sum;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
#define NO_OPT __attribute__((optimize("-O0")))
|
||||
|
||||
/** adjust the sum */
|
||||
void add(const T val) NO_OPT {
|
||||
const T y = val - comp;
|
||||
const T t = sum + y;
|
||||
comp = (t-sum) - y; // very important line
|
||||
sum = t;
|
||||
}
|
||||
|
||||
/** adjust the sum */
|
||||
void sub(const T val) NO_OPT {
|
||||
const T y = val - comp;
|
||||
const T t = sum - y;
|
||||
comp = (t-sum) + y; // very important line
|
||||
sum = t;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static T get(const std::vector<T>& values, const T zero = T()) {
|
||||
return get(values.data(), values.size(), zero);
|
||||
}
|
||||
|
||||
static T get(const T* values, const size_t cnt, const T zero = T()) {
|
||||
|
||||
T sum = zero;
|
||||
volatile T comp = zero;
|
||||
for (size_t i = 0; i < cnt; ++i) {
|
||||
const T inp = values[i];
|
||||
const volatile T y = inp - comp;
|
||||
const volatile T t = sum + y;
|
||||
comp = (t-sum) - y;
|
||||
sum = t;
|
||||
}
|
||||
|
||||
return sum;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // KAHANSUM_H
|
||||
Reference in New Issue
Block a user