#include <iostream>
#include <cmath> // round
#include <vector>
#include <numeric> // For std::gcd
// Function to convert a decimal to a fraction
std::pair<int, int> decimalToFraction(double decimal, double tolerance = 1e-6) {
int numerator = 1, denominator = 1;
double error = std::abs(decimal - static_cast<double>(numerator) / denominator);
// Iteratively find the best numerator and denominator
for (int d = 1; d <= 100000; d++) { // Limit denominator to avoid infinite loops
int n = static_cast<int>(std::round(decimal * d));
double currentError = std::abs(decimal - static_cast<double>(n) / d);
if (currentError < error) {
numerator = n;
denominator = d;
error = currentError;
// Stop if the error is within the acceptable tolerance
if (error < tolerance) {
break;
}
}
}
// Simplify the fraction using GCD
int divisor = std::gcd(numerator, denominator);
numerator /= divisor;
denominator /= divisor;
return {numerator, denominator};
}
int main() {
std::vector<double> testDecimals = {0.5, 0.3333, 0.25, 0.75, 1.2, -0.4, 3.125, 2.71828};
std::cout << "Test Data (Decimal to Fraction):\n";
for (double decimal : testDecimals) {
auto fraction = decimalToFraction(decimal);
std::cout << "Decimal: " << decimal << " -> Fraction: " << fraction.first << "/" << fraction.second << "\n";
}
}
/*
run:
Test Data (Decimal to Fraction):
Decimal: 0.5 -> Fraction: 1/2
Decimal: 0.3333 -> Fraction: 3236/9709
Decimal: 0.25 -> Fraction: 1/4
Decimal: 0.75 -> Fraction: 3/4
Decimal: 1.2 -> Fraction: 6/5
Decimal: -0.4 -> Fraction: -2/5
Decimal: 3.125 -> Fraction: 25/8
Decimal: 2.71828 -> Fraction: 1264/465
*/