比较理性数字

时间:2015-02-16 08:46:48

标签: c++ operator-overloading rational-numbers

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

!=

使用浮点算法实现剩余的关系运算符运算符(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>; <><=)是否可行,否则会导致容易出错结果如何?

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

1 个答案:

答案 0 :(得分:4)

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

实际上根本不需要使用浮点数。在数学上,“a / b> c / d”的测试(假设a,b,c,d为正)等同于测试“a d> b c”。对于无符号变量,您还需要考虑(或解决)模运算的影响(我将这样做作为练习),但完全不使用浮点就可以完全实现测试。< / p>