1

次のような小数があるとします

0.30000000000000027

分数として表現された同じ数を知るための最良のアルゴリズムは何でしょxうかyx=1/y

私が考えていた

 1/3> 0.30 >1/4

それらの1つが収束して最初の反復が次のように>なるまで、左側と右側を反復します=

1/1  >  0.30000000000000027  > 1/somethinghere
1/2  >  0.30000000000000027  > 1/increase or decrease this 
1/3  >  0.30000000000000027 ...

簡単にできることを明確にしたい

0.30000000000000027  =  30000000000000027/  10^17

でもやりたい

0.30000000000000027 = 1/x

C または Haskell で

4

3 に答える 3

4

出来上がり(通常の分数にほぼ適切に変換されます):

int gcd(int a, int b)
{
    if (a == 0) return b;
    if (b == 0) return a;

    if (a > b)
        return gcd(b, a % b);
    else
        return gcd(a, b % a);
}

struct frac {
    int num;
    int denom;
};

struct frac to_frac(double x, int precision)
{
    int denom = 1;
    for (int i = 0; i < precision; i++) {
        denom *= 10;
    }

    int num = x * denom + 0.5; // hack: round if imprecise
    int gcdiv = gcd(num, denom);

    struct frac f;
    f.num = num / gcdiv;
    f.denom = denom / gcdiv;

    return f;
}
于 2013-04-06T06:22:46.157 に答える
3

連分数を調べましたか?それらは、数値の非常に優れた概算を提供します。

于 2013-04-06T11:00:27.260 に答える
2

haskell がわからない、ここに疑似コードがあります:

raw_denom = 1/x;
print "1/" floor(raw_denom) " >= " x " >= 1/" ceil(raw_denom)
于 2013-04-06T06:27:28.500 に答える