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 previous_numerator = 0;
35 int64 previous_denominator = 1;
37 int64 denominator = 0;
39 const int64 term =
static_cast<int64>(std::floor(y));
40 const int64 new_numerator = term * numerator + previous_numerator;
41 const int64 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);