Google OR-Tools: ortools/util/fp_utils.h Source File
22#ifndef ORTOOLS_UTIL_FP_UTILS_H_
23#define ORTOOLS_UTIL_FP_UTILS_H_
34#include "absl/types/span.h"
47static inline double isnan(double value) { return _isnan(value); }
48static inline double round(double value) { return floor(value + 0.5); }
49#elif defined(__APPLE__) || __GNUC__ >= 5
70#elif (defined(__GNUC__) || defined(__llvm__)) && defined(__x86_64__)
86#elif (defined(__GNUC__) || defined(__llvm__)) && defined(__x86_64__) && \
88 CHECK_EQ(0, fegetenv(&fenv_));
91 fenv_.__control &= ~excepts;
92#elif (defined(__FreeBSD__) || defined(__OpenBSD__))
93 fenv_.__x87.__control &= ~excepts;
95 fenv_.x87.control &= ~excepts;
97 fenv_.__control_word &= ~excepts;
100 fenv_.mxcsr &= ~(excepts << 7);
102 fenv_.__mxcsr &= ~(excepts << 7);
111#elif (defined(__GNUC__) || defined(__llvm__)) && defined(__x86_64__)
117template <typename FloatType>
119 return x == std::numeric_limits<FloatType>::infinity() ||
130template <typename FloatType>
132 FloatType relative_tolerance,
133 FloatType absolute_tolerance) {
134 DCHECK_LE(0.0, relative_tolerance);
135 DCHECK_LE(0.0, absolute_tolerance);
136 DCHECK_GT(1.0, relative_tolerance);
140 const FloatType difference = fabs(x - y);
141 if (difference <= absolute_tolerance) {
144 const FloatType largest_magnitude = std::max(fabs(x), fabs(y));
145 return difference <= largest_magnitude * relative_tolerance;
151template <typename FloatType>
153 FloatType absolute_tolerance) {
154 DCHECK_LE(0.0, absolute_tolerance);
163template <typename FloatType>
172template <typename FloatType>
181#define EXPECT_COMPARABLE(expected, obtained, epsilon) \
182 EXPECT_TRUE(operations_research::AreWithinAbsoluteOrRelativeTolerances( \
183 expected, obtained, epsilon, epsilon)) \
187#define EXPECT_NOTCOMPARABLE(expected, obtained, epsilon) \
188 EXPECT_FALSE(operations_research::AreWithinAbsoluteOrRelativeTolerances( \
189 expected, obtained, epsilon, epsilon)) \
219 double* max_relative_coeff_error);
226 absl::Span<const double> lb,
227 absl::Span<const double> ub,
228 int64_t max_absolute_sum);
238 absl::Span<const double> lb,
239 absl::Span<const double> ub, double scaling_factor,
240 double* max_relative_coeff_error,
241 double* max_scaled_sum_error);
251template <typename FloatType>
252inline FloatType Interpolate(FloatType x, FloatType y, FloatType alpha) {
256inline int fast_ilogb(double value) { return ilogb(value); }
void EnableExceptions(int excepts)
Definition fp_utils.h:83
~ScopedFloatingPointEnv()
Definition fp_utils.h:75
ScopedFloatingPointEnv()
Definition fp_utils.h:67
int fast_ilogb(double value)
Definition fp_utils.h:256
bool IsSmallerWithinTolerance(FloatType x, FloatType y, FloatType tolerance)
Definition fp_utils.h:164
bool IsIntegerWithinTolerance(FloatType x, FloatType tolerance)
Definition fp_utils.h:173
double fast_scalbn(double value, int exponent)
Definition fp_utils.h:257
double GetBestScalingOfDoublesToInt64(absl::Span< const double > input, absl::Span< const double > lb, absl::Span< const double > ub, int64_t max_absolute_sum)
FloatType Interpolate(FloatType x, FloatType y, FloatType alpha)
Definition fp_utils.h:252
bool AreWithinAbsoluteOrRelativeTolerances(FloatType x, FloatType y, FloatType relative_tolerance, FloatType absolute_tolerance)
Definition fp_utils.h:131
bool AreWithinAbsoluteTolerance(FloatType x, FloatType y, FloatType absolute_tolerance)
Definition fp_utils.h:152
void ComputeScalingErrors(absl::Span< const double > input, absl::Span< const double > lb, absl::Span< const double > ub, double scaling_factor, double *max_relative_coeff_error, double *max_scaled_sum_error)
int64_t ComputeGcdOfRoundedDoubles(absl::Span< const double > x, double scaling_factor)
bool IsPositiveOrNegativeInfinity(FloatType x)
Definition fp_utils.h:118
static int input(yyscan_t yyscanner)