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