#include #include "TMath.h" void println(std::string str) { std::cout << str << std::endl; } int get_ten_pow(double number) { int sign = 0; int pow = 0; if (number >= 1) { sign = 1; while (number >= 1) { // std::cout << number << " " << pow << std::endl; number = number / 10; pow++; } } else { sign = -1; while (number < 1) { number = number * 10; pow++; } } return sign * pow; } int get_decimals(double number) { int dec = 0; while ((int) number != number) { number = number * 10; dec++; } return dec; } int rounder() { // 2,543 ± 0,235 174,032 ± 82,543 double val = 1.2456;// -> 4300 double err = 0.2231; // -> 240 std::cout << get_ten_pow(231.4345) << " " << get_ten_pow(0.0045) << std::endl; int mv = 0; if (err < 1) { mv = 1; } else { mv = -1; } int pot = 0; while((mv == 1 && err < 3) || (mv == -1 && err > 30)) { err = err * TMath::Power(10, mv); pot++; } int err_ten_pow = get_ten_pow(err); int val_ten_pow = get_ten_pow(val); int diff = TMath::Abs(err_ten_pow - val_ten_pow); double input_err = err * TMath::Power(10, -mv * pot); double round_err = TMath::Ceil(err) * TMath::Power(10, -mv * pot); int err_dec = get_decimals(round_err); diff += err_dec; double mv_val = val * TMath::Power(10, mv * diff); double round_val = TMath::Ceil(mv_val) * TMath::Power(10, -mv * diff); std::cout << val << " " << mv_val << " " << err << " " << input_err<< " " << std::endl; std::cout << val << "+-" << input_err << " -> " << round_val << "+-" << round_err << std::endl; return 0; }