How can I turn a floating point number into the closest fraction represented by a byte numerator and denominator?

后端 未结 6 994
南旧
南旧 2021-01-06 23:44

How can I write an algorithm that given a floating point number, and attempts to represent is as accurately as possible using a numerator and a denominator, both restricted

6条回答
  •  清酒与你
    2021-01-07 00:06

    Here's the code I used in the end (based on uckelman's code)

    public static int[] GetFraction(double input)
    {
        int p0 = 1;
        int q0 = 0;
        int p1 = (int) Math.floor(input);
        int q1 = 1;
        int p2;
        int q2;
    
        double r = input - p1;
        double next_cf;
        while(true)
        {
            r = 1.0 / r;
            next_cf = Math.floor(r);
            p2 = (int) (next_cf * p1 + p0);
            q2 = (int) (next_cf * q1 + q0);
    
            // Limit the numerator and denominator to be 256 or less
            if(p2 > 256 || q2 > 256)
                break;
    
            // remember the last two fractions
            p0 = p1;
            p1 = p2;
            q0 = q1;
            q1 = q2;
    
            r -= next_cf;
        }
    
        input = (double) p1 / q1;
        // hard upper and lower bounds for ratio
        if(input > 256.0)
        {
            p1 = 256;
            q1 = 1;
        }
        else if(input < 1.0 / 256.0)
        {
            p1 = 1;
            q1 = 256;
        }
        return new int[] {p1, q1};
    }
    

    Thanks for those who helped

提交回复
热议问题