You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.6 KiB
78 lines
1.6 KiB
#include <iostream>
|
|
|
|
#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;
|
|
}
|