Listing 9: Two-argument version of
PropagateUncertaintiesBySlope()
UDouble<is_correlated> PropagateUncertaintiesBySlope(
double (*certain_func)(double, double),
const UDouble<is_correlated>& arg1,
const UDouble<is_correlated>& arg2)
{
UDouble<is_correlated> retval;
retval.value = certain_func(arg1.value, arg2.value);
if (is_correlated)
{
double up_val = certain_func(arg1.value + arg1.uncertainty,
arg2.value + arg2.uncertainty);
double down_val = certain_func(arg1.value - arg1.uncertainty,
arg2.value - arg2.uncertainty);
retval.uncertainty = 0.5 * (up_val - down_val);
}
else
{
double up_val1 = certain_func(arg1.value + arg1.uncertainty,
arg2.value);
double down_val1 = certain_func(arg1.value - arg1.uncertainty,
arg2.value);
double up_val2 = certain_func(arg1.value,
arg2.value + arg2.uncertainty);
double down_val2 = certain_func(arg1.value,
arg2.value - arg2.uncertainty);
retval.uncertainty = 0.5 * hypot(up_val1 - down_val1,
up_val2 - down_val2);
}
return retval;
}
//End of File