13namespace autopas::utils::Math {
30template <
class Int_t, std::enable_if_t<std::is_
integral_v<Int_t>,
bool> = true>
31Int_t
safeAdd(
const Int_t &a,
const Int_t &b,
const Int_t &valUnderflow = std::numeric_limits<Int_t>::min(),
32 const Int_t &valOverflow = std::numeric_limits<Int_t>::max()) {
34 bool overflow = __builtin_add_overflow(a, b, &result);
37 if (a < 0 and b < 0) {
38 result = valUnderflow;
59template <
class Float_t, std::enable_if_t<std::is_
floating_po
int_v<Float_t>,
bool> = true>
60Float_t
safeAdd(
const Float_t &a,
const Float_t &b,
const Float_t &valUnderflow = -std::numeric_limits<Float_t>::max(),
61 const Float_t &valOverflow = std::numeric_limits<Float_t>::max()) {
62 Float_t result = a + b;
63 if (std::isinf(result)) {
67 result = valUnderflow;
83template <
class Int_t, std::enable_if_t<std::is_
integral_v<Int_t>,
bool> = true>
84Int_t
safeSub(
const Int_t &a,
const Int_t &b,
const Int_t &valUnderflow = std::numeric_limits<Int_t>::min(),
85 const Int_t &valOverflow = std::numeric_limits<Int_t>::max()) {
87 bool overflow = __builtin_sub_overflow(a, b, &result);
91 result = valUnderflow;
112template <
class Float_t, std::enable_if_t<std::is_
floating_po
int_v<Float_t>,
bool> = true>
113Float_t
safeSub(
const Float_t &a,
const Float_t &b,
const Float_t &valUnderflow = -std::numeric_limits<Float_t>::max(),
114 const Float_t &valOverflow = std::numeric_limits<Float_t>::max()) {
115 Float_t result = a - b;
116 if (std::isinf(result)) {
118 result = valOverflow;
120 result = valUnderflow;
136template <
class Int_t, std::enable_if_t<std::is_
integral_v<Int_t>,
bool> = true>
137Int_t
safeMul(
const Int_t &a,
const Int_t &b,
const Int_t &valUnderflow = std::numeric_limits<Int_t>::min(),
138 const Int_t &valOverflow = std::numeric_limits<Int_t>::max()) {
140 bool overflow = __builtin_mul_overflow(a, b, &result);
143 if ((a < 0) xor (b < 0)) {
144 result = valUnderflow;
146 result = valOverflow;
165template <
class Float_t, std::enable_if_t<std::is_
floating_po
int_v<Float_t>,
bool> = true>
166Float_t
safeMul(
const Float_t &a,
const Float_t &b,
const Float_t &valUnderflow = -std::numeric_limits<Float_t>::max(),
167 const Float_t &valOverflow = std::numeric_limits<Float_t>::max()) {
168 Float_t result = a * b;
169 if (std::isinf(result)) {
171 result = valOverflow;
173 result = valUnderflow;
186template <
size_t exponent,
class T>
194 for (
size_t i = 0; i < exponent - 1; ++i) {
205double normalPDF(
double x);
212double normalCDF(
double x);
219double sigmoid(
double x);
228bool isNearRel(
double a,
double b,
double maxRelativeDifference = 1e-9);
237bool isNearAbs(
double a,
double b,
double maxAbsoluteDifference);
245double roundFixed(
double d,
int fixedPrecision);
253double roundFloating(
double d,
int floatingPrecision);
260Eigen::VectorXd makeVectorXd(
const std::vector<double> &elements);
267Eigen::VectorXi makeVectorXi(
const std::vector<int> &elements);
Int_t safeAdd(const Int_t &a, const Int_t &b, const Int_t &valUnderflow=std::numeric_limits< Int_t >::min(), const Int_t &valOverflow=std::numeric_limits< Int_t >::max())
Addition function for integer types that is safe against over and underflow.
Definition: Math.h:31
Int_t safeSub(const Int_t &a, const Int_t &b, const Int_t &valUnderflow=std::numeric_limits< Int_t >::min(), const Int_t &valOverflow=std::numeric_limits< Int_t >::max())
Subtraction function for integer types that is safe against over and underflow.
Definition: Math.h:84
Int_t safeMul(const Int_t &a, const Int_t &b, const Int_t &valUnderflow=std::numeric_limits< Int_t >::min(), const Int_t &valOverflow=std::numeric_limits< Int_t >::max())
Multiplication function for integer types that is safe against over and underflow.
Definition: Math.h:137
T pow(const T &base)
No-overhead power function with exponent known at compile time.
Definition: Math.h:187
const double normalScale
Factor of PDF of standard normal distribution.
Definition: Math.h:18