Как я могу отформатировать десятичную дробь с ограничениями на знаменатель - PullRequest
1 голос
/ 24 августа 2010

Привет. Все, что я пытаюсь отформатировать десятичную A в дробь B + C / D, где на D накладывается определенный предел, скажем, D может быть один из [2 ... 9] или [2 ... 19] и т. д. BCD - целые числа. Цель состоит в том, чтобы получить отформатированную дробь как можно ближе к десятичной дроби.Существует ли существующий алгоритм / теория по этому вопросу?Или есть какой-нибудь API, который я могу вызвать на Mac SDK?

Ответы [ 2 ]

1 голос
/ 24 августа 2010
// Not tested or even compiled :-). Assumes you are handling sign
// in:  a - the decimal to convert
//      limit - the largest denominator you will allow
// out: outN - Numerator
//      outD   Denominator

#include <math.h>

void d2f(double a, int limit, int& outN, int& outD) {
    double z;
    int dPrev, d, n;
    a = fabs(a);
    z = a;
    d = 1;
    n = a;
    dPrev = 0;
    while (a - (double)(n/d) != 0 && z != floor(z)) {
        z = 1 / (z - floor(z));
        int tmp = d;
        d = d * (int)floor(z) + dPrev;
        if (d > limit) {
            d = tmp;
            break;
        }
        dPrev = tmp;
        n = floor(a * d + 0.5);
    }
    outN = n;
    outD = d;
}

Надеюсь, что поможет / работает: -)

0 голосов
/ 24 августа 2010

Просмотрите дроби.

...