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_」で始まる変数はメンバー変数です。
ありがとう