TU-Programmieren_2/lab3/modules/iue-num/numerics.test.cpp
2025-04-09 10:22:44 +02:00

69 lines
1.7 KiB
C++

/// @file
/// @brief Test for iue::num::islcose
#include "iue-num/numerics.hpp" // iue::num::islcose
#include <cassert> // assert
#include <cstdlib> // EXIT_SUCCESS
#include <limits> // std::numeric_limits
int main() {
const double eps = std::numeric_limits<double>::epsilon();
const double inf = std::numeric_limits<double>::infinity();
const double nan = std::numeric_limits<double>::quiet_NaN();
{ // infinity
assert(iue::num::isclose(inf, inf, 0.0, 0.0));
assert(iue::num::isclose(-inf, -inf, 0.0, 0.0));
assert(!iue::num::isclose(-inf, inf, 0.0, 0.0));
assert(!iue::num::isclose(inf, -inf, 0.0, 0.0));
}
{ // nan
assert(!iue::num::isclose(nan, nan, inf, inf));
}
{ // around 1.0
double a = 1.0;
double b = 1.0 + eps;
// rel error
assert(iue::num::isclose(a, b, 0.0, 2 * eps));
assert(!iue::num::isclose(a, b, 0.0, 0.0));
// abs error
assert(iue::num::isclose(a, b, 2 * eps, 0.0));
assert(!iue::num::isclose(a, b, 0.0, 0.0));
}
{ // around 1e10
double a = 1.0 * 1e10;
double b = (1.0 + eps) * 1e10;
// rel error
assert(iue::num::isclose(a, b, 0.0, 2 * eps));
assert(!iue::num::isclose(a, b, 0.0, 0.0));
// abs error
assert(iue::num::isclose(a, b, 1e10 * 2 * eps, 0.0));
assert(!iue::num::isclose(a, b, 1e9 * 2 * eps, 0.0));
}
{ // around 1e-10
double a = 1.0 * 1e-10;
double b = (1.0 + eps) * 1e-10;
// rel error
assert(iue::num::isclose(a, b, 0.0, 2 * eps));
assert(!iue::num::isclose(a, b, 0.0, 0.0));
// abs error
assert(iue::num::isclose(a, b, 1e-10 * 2 * eps, 0.0));
assert(!iue::num::isclose(a, b, 1e-11 * 2 * eps, 0.0));
}
return EXIT_SUCCESS;
}