0

class NaturalNum自然数の「無限」サイズ (最大 4GB) を表すために実装しました。

class RationalNumまた、無限の精度で有理数を表すために実装しました。有理数の分子と分母を格納します。どちらもNaturalNumインスタンスであり、ユーザーが発行した算術演算を実行するときにそれらに依存します。

精度が「ある程度低下」する唯一の場所は印刷時です。これは、小数点 (または非小数点) の後に表示される桁数に制限 (ユーザーによって提供される) があるためです。

私の質問は、 のコンストラクターの 1 つに関するものですclass RationalNum。つまり、double値を取り、対応する分子と分母を計算するコンストラクターです。

私のコードを以下に示します。誰かがそれらを計算するためのより正確な方法を見ているかどうか知りたいです:

RationalNum::RationalNum(double value)
{
    if (value == value+1)
        throw "Infinite Value";
    if (value != value)
        throw "Undefined Value";

    m_sign        = false;
    m_numerator   = 0;
    m_denominator = 1;

    if (value < 0)
    {
        m_sign = true;
        value  = -value;
    }

    // Here is the actual computation
    while (value > 0)
    {
        unsigned int floor = (unsigned int)value;
        value         -= floor;
        m_numerator   += floor;
        value         *= 2;
        m_numerator   *= 2;
        m_denominator *= 2;
    }

    NaturalNum gcd = GCD(m_numerator,m_denominator);
    m_numerator   /= gcd;
    m_denominator /= gcd;
}

注: 「m_」で始まる変数はメンバー変数です。

ありがとう

4

2 に答える 2

3

標準ライブラリには仮数と指数を取得する関数 が含まれていますfrexp

仮数を掛けて小数点の前のすべてのビットを取得し、適切な分母を設定します。仮数が 0.5 から 1 の間に正規化されていることを忘れないでください (1 から 2 の間のほうが自然だと思いますが、どうでもいいです)。ポイント形式)。

于 2014-01-18T23:51:39.290 に答える