Listing 3: Function uncertain_print()
// prints uncertainty to 2 digits and value to same precision inline void uncertain_print(double mean, double sigma, ostream &os = cout) { int original_precision = os.precision(); long original_format = os.flags(ios::showpoint); int precision; // special cases for zero, NaN, and Infinities // (positive & negative) if ((sigma == 0.0) || (sigma != sigma) || (1.0/sigma == 0.0)) { precision = 0; } else { // round sigma to 2 digits int sigma_digits = 1 - int(floor(log10(fabs(sigma)))); double round_10_pow = pow(10.0, sigma_digits); sigma = floor(sigma * round_10_pow + 0.5) / round_10_pow; // round mean to same # of digits mean = floor(mean * round_10_pow + 0.5) / round_10_pow; if (mean == 0.0) { if (sigma_digits > 0) precision = sigma_digits + 1; else precision = 1; } else { precision = int(floor(log10(fabs(mean)))) + sigma_digits + 1; if (precision < 1) { mean = 0.0; if (sigma_digits > 0) precision = sigma_digits + 1; else precision = 1; } } } os << setprecision(precision) << mean << " +/- " << setprecision(2) << sigma << setprecision(original_precision); os.flags(original_format); } //End of File