more automated unit tests
This commit is contained in:
parent
e907f4571d
commit
218cb67ea7
@ -105,7 +105,6 @@ TEST_CASE("multiply"){
|
|||||||
CHECK_THAT(Buf, Equals("-8527724.41172991849")); //acc*b
|
CHECK_THAT(Buf, Equals("-8527724.41172991849")); //acc*b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void div_test(
|
static void div_test(
|
||||||
//input
|
//input
|
||||||
const char* a_str, int a_exp,
|
const char* a_str, int a_exp,
|
||||||
@ -176,5 +175,134 @@ TEST_CASE("division"){
|
|||||||
"0.02", 0,
|
"0.02", 0,
|
||||||
"0.03", 0
|
"0.03", 0
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void log_test(
|
||||||
|
//input
|
||||||
|
const char* x_str, int x_exp,
|
||||||
|
bool base10=false
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CAPTURE(x_str); CAPTURE(x_exp);
|
||||||
|
CAPTURE(base10);
|
||||||
|
build_dec80(x_str, x_exp);
|
||||||
|
// decn_to_str_complete(&AccDecn);
|
||||||
|
// printf(" acc: %s\n", Buf);
|
||||||
|
if (base10){
|
||||||
|
log10_decn();
|
||||||
|
} else {
|
||||||
|
ln_decn();
|
||||||
|
}
|
||||||
|
decn_to_str_complete(&AccDecn);
|
||||||
|
CAPTURE(Buf); // log(x)
|
||||||
|
|
||||||
|
//calculate actual result
|
||||||
|
bmp::mpfr_float::default_precision(50);
|
||||||
|
bmp::mpfr_float calculated(Buf);
|
||||||
|
std::string x_full_str(x_str);
|
||||||
|
x_full_str += "e" + std::to_string(x_exp);
|
||||||
|
// CAPTURE(x_full_str);
|
||||||
|
bmp::mpfr_float x_actual(x_full_str);
|
||||||
|
if (base10){
|
||||||
|
x_actual = log10(x_actual);
|
||||||
|
} else {
|
||||||
|
x_actual = log(x_actual);
|
||||||
|
}
|
||||||
|
CAPTURE(x_actual);
|
||||||
|
bmp::mpfr_float rel_diff = abs((x_actual - calculated) / x_actual);
|
||||||
|
CHECK(rel_diff < 3e-16); //TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("log"){
|
||||||
|
log_test("0.155", 0);
|
||||||
|
log_test("10", 0);
|
||||||
|
log_test("1.1", 10);
|
||||||
|
log_test("2.02", -10);
|
||||||
|
log_test("2.02", 0);
|
||||||
|
log_test("1.5", 0, true);
|
||||||
|
log_test("9", 99);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void exp_test(
|
||||||
|
//input
|
||||||
|
const char* x_str, int x_exp,
|
||||||
|
double epsilon=6e-16
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CAPTURE(x_str); CAPTURE(x_exp);
|
||||||
|
build_dec80(x_str, x_exp);
|
||||||
|
exp_decn();
|
||||||
|
decn_to_str_complete(&AccDecn);
|
||||||
|
CAPTURE(Buf); // exp(x)
|
||||||
|
|
||||||
|
//calculate actual result
|
||||||
|
bmp::mpfr_float::default_precision(50);
|
||||||
|
bmp::mpfr_float calculated(Buf);
|
||||||
|
std::string x_full_str(x_str);
|
||||||
|
x_full_str += "e" + std::to_string(x_exp);
|
||||||
|
bmp::mpfr_float x_actual(x_full_str);
|
||||||
|
x_actual = exp(x_actual);
|
||||||
|
CAPTURE(x_actual);
|
||||||
|
bmp::mpfr_float rel_diff = abs((x_actual - calculated) / x_actual);
|
||||||
|
CHECK(rel_diff < epsilon);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("exp"){
|
||||||
|
exp_test("4.4", 0);
|
||||||
|
exp_test("0.155", 0);
|
||||||
|
exp_test("9.999", 0);
|
||||||
|
exp_test("10", 0);
|
||||||
|
exp_test("10.001", 0);
|
||||||
|
exp_test("2.3", 2, 6e-15);
|
||||||
|
exp_test("2.02", -10);
|
||||||
|
exp_test("2.02", 0);
|
||||||
|
exp_test("1.5", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pow_test(
|
||||||
|
//input
|
||||||
|
const char* a_str, int a_exp,
|
||||||
|
const char* b_str, int b_exp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CAPTURE(a_str); CAPTURE(a_exp);
|
||||||
|
CAPTURE(b_str); CAPTURE(b_exp);
|
||||||
|
|
||||||
|
//compute power
|
||||||
|
log_test(a_str, a_exp);
|
||||||
|
build_decn_at(&BDecn, b_str, b_exp);
|
||||||
|
mult_decn();
|
||||||
|
int8_t exp_test_exp = decn_to_str(&AccDecn);
|
||||||
|
std::string copied(Buf);
|
||||||
|
exp_test(copied.c_str(), exp_test_exp, 6e-15);
|
||||||
|
|
||||||
|
decn_to_str_complete(&AccDecn);
|
||||||
|
CAPTURE(Buf); // a^b
|
||||||
|
|
||||||
|
//calculate actual result
|
||||||
|
bmp::mpfr_float::default_precision(50);
|
||||||
|
bmp::mpfr_float calculated(Buf);
|
||||||
|
std::string a_full_str(a_str);
|
||||||
|
a_full_str += "e" + std::to_string(a_exp);
|
||||||
|
std::string b_full_str(b_str);
|
||||||
|
b_full_str += "e" + std::to_string(b_exp);;
|
||||||
|
// CAPTURE(a_full_str);
|
||||||
|
// CAPTURE(b_full_str);
|
||||||
|
bmp::mpfr_float a_actual(a_full_str);
|
||||||
|
bmp::mpfr_float b_actual(b_full_str);
|
||||||
|
a_actual = exp(log(a_actual) * b_actual);
|
||||||
|
bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual);
|
||||||
|
CHECK(rel_diff < 3e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("power"){
|
||||||
|
pow_test(
|
||||||
|
"3.14", 60,
|
||||||
|
"-1.5", -2
|
||||||
|
);
|
||||||
|
|
||||||
|
pow_test(
|
||||||
|
"3", 0,
|
||||||
|
"201", 0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ using namespace boost::multiprecision;
|
|||||||
using std::cout;
|
using std::cout;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
|
||||||
static const int NUM_A_ARR = 9;
|
static const int NUM_A_ARR = 10;
|
||||||
mpfr_float a_arr[NUM_A_ARR];
|
mpfr_float a_arr[NUM_A_ARR];
|
||||||
mpfr_float ln_a_arr[NUM_A_ARR];
|
mpfr_float ln_a_arr[NUM_A_ARR];
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ int main(void){
|
|||||||
calc = accum;
|
calc = accum;
|
||||||
diff = abs((actual - calc)/actual);
|
diff = abs((actual - calc)/actual);
|
||||||
|
|
||||||
if (diff > 5e-17){
|
if (diff > 1e-17){
|
||||||
cout << x << ": ";
|
cout << x << ": ";
|
||||||
cout << std::setprecision(18) << accum << ", ";
|
cout << std::setprecision(18) << accum << ", ";
|
||||||
cout << diff << endl;
|
cout << diff << endl;
|
||||||
|
Loading…
Reference in New Issue
Block a user