Fractions instead of decimals

前端 未结 1 1682
旧时难觅i
旧时难觅i 2021-01-27 09:47

So, I am Writing this little program in c++, it\'s made to compute various values with lines (sorry i am french, i don\'t know how to say it in English, but they are the lines w

相关标签:
1条回答
  • 2021-01-27 10:16

    A nice way to approximate a float with a fraction is to used continued fractions. In the following code, epsis the desired precision. xis assumed to be strictly positive.

    #include    <iostream>
    #include    <iomanip>
    #include    <cmath>
    #include    <tuple>
    #include    <vector>
    #include    <cmath>
    
    //  Continued fraction
    std::pair<int, int> fract_cont (double x, double eps = 1.0e-3) {
        std::vector<int> a;
        std::vector<int> b;
        a.push_back(1);
        b.push_back(0);
        int q = int(x);
        a.push_back(q);
        b.push_back(1);
        double err = x - q;
        double e = (x != q) ? 1.0 / (x - q) : 0.0;
        int i = 1;
    
        while (std::abs(err) > eps) {
            i++;
            q = int (e);
            e = 1.0 / (e - q);
            a.push_back (q * a[i-1] + a [i-2]);
            b.push_back (q * b[i - 1] + b[i-2]);
            err = x - double (a[i]) / b[i];
        } 
        return std::make_pair(a[i], b[i]);
    }
    
    int main() {
        int a, b;
        double x = 4 * atan(1.0);
        std::tie (a,b) = fract_cont(x);
        std::cout <<"Pi = " << std::setprecision(9) << x << " ~= " << a << "/" << b << "\n";
        return 0;
    }
    

    Detailed information on continued fractions is available on Wikipedia for example.

    If you don't need a high precision or if you assume that the denominators will be small, you can use a brute force approach instead, simply incrementing the denominator b.

    0 讨论(0)
提交回复
热议问题