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