56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
|
#include <limits>
|
||
|
|
||
|
#include "catch.hpp"
|
||
|
|
||
|
#include "vtr_math.h"
|
||
|
|
||
|
TEST_CASE("Nearest Integer", "[vtr_math]") {
|
||
|
REQUIRE(vtr::nint(0.) == 0);
|
||
|
REQUIRE(vtr::nint(0.1) == 0);
|
||
|
REQUIRE(vtr::nint(0.5) == 1);
|
||
|
REQUIRE(vtr::nint(0.9) == 1);
|
||
|
|
||
|
REQUIRE(vtr::nint(1.) == 1);
|
||
|
REQUIRE(vtr::nint(1.1) == 1);
|
||
|
REQUIRE(vtr::nint(1.5) == 2);
|
||
|
REQUIRE(vtr::nint(1.9) == 2);
|
||
|
|
||
|
REQUIRE(vtr::nint(42.) == 42);
|
||
|
REQUIRE(vtr::nint(42.1) == 42);
|
||
|
REQUIRE(vtr::nint(42.5) == 43);
|
||
|
REQUIRE(vtr::nint(42.9) == 43);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Safe Ratio", "[vtr_math]") {
|
||
|
REQUIRE(vtr::safe_ratio(1., 1.) == Approx(1.));
|
||
|
REQUIRE(vtr::safe_ratio(1., 2.) == Approx(0.5));
|
||
|
REQUIRE(vtr::safe_ratio(50., 0.) == Approx(0.));
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Is Close", "[vtr_math]") {
|
||
|
//double NAN = std::numeric_limits<double>::quiet_NaN();
|
||
|
double INF = std::numeric_limits<double>::infinity();
|
||
|
|
||
|
double num = 32.4;
|
||
|
|
||
|
double num_close = num - vtr::DEFAULT_REL_TOL * num / 2;
|
||
|
double num_not_quite_close = num - 2 * vtr::DEFAULT_REL_TOL * num;
|
||
|
double num_far = 2 * num;
|
||
|
|
||
|
REQUIRE(vtr::isclose(-1., -1.));
|
||
|
REQUIRE(vtr::isclose(1., 1.));
|
||
|
REQUIRE(vtr::isclose(0., 0.));
|
||
|
REQUIRE(vtr::isclose(num, num));
|
||
|
REQUIRE(vtr::isclose(num, num_close));
|
||
|
REQUIRE(!vtr::isclose(num, num_not_quite_close));
|
||
|
REQUIRE(!vtr::isclose(num, num_far));
|
||
|
|
||
|
REQUIRE(vtr::isclose(INF, INF));
|
||
|
REQUIRE(!vtr::isclose(-INF, INF));
|
||
|
REQUIRE(!vtr::isclose(NAN, NAN));
|
||
|
|
||
|
//Absolute tolerance tests
|
||
|
REQUIRE(vtr::isclose(32.2, 32.4, 1e-9, 0.2));
|
||
|
REQUIRE(!vtr::isclose(32.2, 32.4, 1e-9, 0.1));
|
||
|
}
|