27 DCHECK_LT(x, std::numeric_limits<double>::infinity());
28 DCHECK_GT(x, -std::numeric_limits<double>::infinity());
32 long double abs_x = std::abs(x);
33 long double y = abs_x;
34 int64_t previous_numerator = 0;
35 int64_t previous_denominator = 1;
36 int64_t numerator = 1;
37 int64_t denominator = 0;
39 const int64_t term =
static_cast<int64_t
>(std::floor(y));
40 const int64_t new_numerator = term * numerator + previous_numerator;
41 const int64_t new_denominator = term * denominator + previous_denominator;
44 if (new_numerator < 0 || new_denominator < 0)
break;
45 previous_numerator = numerator;
46 previous_denominator = denominator;
47 numerator = new_numerator;
48 denominator = new_denominator;
49 long double numerator_approximation = abs_x * denominator;
50 if (std::abs(numerator_approximation - numerator) <=
51 precision * numerator_approximation) {
56 return Fraction((x < 0) ? -numerator : numerator, denominator);
#define DCHECK_GT(val1, val2)
#define DCHECK_LT(val1, val2)
Collection of objects used to extend the Constraint Solver library.
Fraction RationalApproximation(const double x, const double precision)
std::pair< int64_t, int64_t > Fraction