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
|
#include <alignment/utils/LogUtils.hpp>
double LogSumOfTwo(double value1, double value2)
{
//
// value1 and value2 are in log space already.
//
double minValue, maxValue;
minValue = value1, maxValue = value2;
if (maxValue < minValue) {
minValue = value2;
maxValue = value1;
}
// convert to log10
minValue *= LOG10;
maxValue *= LOG10;
double difference = minValue - maxValue;
if (difference < LOG_EPSILON) {
return maxValue / LOG10;
} else if (difference < LOG_EPSILON2) {
return (maxValue + exp(difference)) / LOG10;
} else {
float expv = exp(difference);
float log1pv = log1p(expv);
return (maxValue + log1pv) / LOG10;
}
}
double LogSumOfThree(double value1, double value2, double value3)
{
double minValue, maxValue, middleValue;
if (value1 > value2 and value2 > value3) {
maxValue = value1;
middleValue = value2;
minValue = value3;
} else if (value1 > value3 and value3 > value2) {
maxValue = value1;
middleValue = value3;
minValue = value2;
} else if (value2 > value1 and value1 > value3) {
maxValue = value2;
middleValue = value1;
minValue = value3;
} else if (value2 > value3 and value3 > value1) {
maxValue = value2;
middleValue = value3;
minValue = value1;
} else if (value3 > value1 and value1 > value2) {
maxValue = value3;
middleValue = value1;
minValue = value2;
} else {
maxValue = value3;
middleValue = value2;
minValue = value1;
}
return LogSumOfTwo(maxValue, LogSumOfTwo(middleValue, minValue));
}
|