/usr/include/osl/misc/math.h is in libosl-dev 0.8.0-1.4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #ifndef OSL_MISC_MATH_H
#define OSL_MISC_MATH_H
#include <numeric>
#include <cmath>
#include <algorithm>
#include <functional>
namespace osl
{
namespace misc
{
/**
* Reference: C++ Cookbook, Stephens, Diggins, Turkanis and Cogswell, O'Reilly,
*/
template<unsigned int N, class T>
T nthPower(T x)
{
if (N==0)
return 1;
const T temp = nthPower<N/2>(x);
if (N%2 == 0)
return temp * temp;
else
return temp * temp * x;
}
template<class T, int N>
struct SumDiffNthPower
{
T mean;
SumDiffNthPower(T mean) : mean(mean) {}
T operator()(T sum, T current)
{
return sum + nthPower<N>(current - mean);
}
};
template<class T, int N, class Iter_T>
T nthMoment(Iter_T first, Iter_T last, T mean)
{
const size_t cnt = distance(first, last);
return accumulate(first, last, T(), SumDiffNthPower<T, N>(mean))/cnt;
}
template<class T, class Iter_T>
T computeVariance(Iter_T first, Iter_T last, T mean)
{
return nthMoment<T, 2>(first, last, mean);
}
template<class T, class Iter_T>
T computeStdDev(Iter_T first, Iter_T last, T mean)
{
return sqrt(computeVariance(first, last, mean));
}
template<class T, class Iter_T>
T computeSkew(Iter_T first, Iter_T last, T mean)
{
const T m3 = nthMoment<T, 3>(first, last, mean);
const T m2 = nthMoment<T, 2>(first, last, mean);
return m3 / (m2 * sqrt(m2));
}
template<class T, class Iter_T>
T computeKurtosisExcess(Iter_T first, Iter_T last, T mean)
{
const T m4 = nthMoment<T, 4>(first, last, mean);
const T m2 = nthMoment<T, 2>(first, last, mean);
return m4 / (m2 * m2) - 3;
}
template<class T, class Iter_T>
void computeStats(Iter_T first, Iter_T last,
T& sum, T& mean, T&var, T&std_dev, T& skew, T& kurt)
{
const size_t cnt = distance(first, last);
sum = accumulate(first, last, T());
mean = sum / cnt;
var = computeVariance(first, last, mean);
std_dev = sqrt(var);
skew = computeSkew(first, last, mean);
kurt = computeKurtosisExcess(first, last, mean);
}
}
}
#endif /* _MISC_MATH_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|