3

我用所有通用算术函数(+、、、、-和)制作了以下有理数 C++类。*/==!=

template <class T>
struct rationalNumber
{
    static_assert(!std::numeric_limits<T>::is_signed, "ERROR: Type T must be unsigned");
    static_assert(std::is_integral<T>::value, "ERROR: Type T must be integral");

    T numerator;
    T denominator;
    bool sign;

    rationalNumber(const int n = 0) : numerator(std::abs(n)), denominator(1), sign(std::signbit(n)) {}
    rationalNumber(const T n, const T d, const bool s = false) : numerator(n), denominator(d), sign(s) {}
    rationalNumber(const rationalNumber&) = default;
    rationalNumber& operator=(const rationalNumber&) = default;

    rationalNumber operator-() const
    {
        return rationalNumber(numerator, denominator, !sign);
    }

    void reduce()
    {
        T divisor = gcd(numerator, denominator);
        if (divisor != 1)
        {
            numerator /= divisor;
            denominator /= divisor;
        }
        else if (numerator == 0)
        {
            denominator = 1;
            sign = false;
        }

        assert(denominator != 0);
    }
};

using RN = rationalNumber<unsigned long long>;

使用浮点算术实现剩余的关系运算符运算符 ( <, >, <=, ) 是否可行,还是会导致容易出错的结果?>=

请注意,我只考虑了浮点数,因为在许多情况下交叉乘法会导致整数溢出。

4

1 回答 1

3

是的,使用浮点运算实现不等式测试是可行的。而且,是的,由于浮点的有限精度,这可能会产生“容易出错的结果”。

实际上根本不需要使用浮点数。在数学上,“a/b > c/d”(假设 a、b、c、d 为正)的测试等价于“a d > b c”测试。对于无符号变量,您还需要考虑(或解决)模运算的影响(我将把它作为练习),但是完全不使用浮点来实现测试是非常可行的。

于 2015-02-16T09:08:35.267 回答