比较有理数
Comparing Rational Numbers
我用所有通用算术函数(+
、-
、*
、/
、==
和 !=
)。
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>;
是否可以使用浮点运算实现剩余的关系运算符运算符(<
、>
、<=
、>=
),或者会导致容易出错的结果?
请注意,我只考虑了浮点数,因为交叉乘法在许多情况下会导致整数溢出。
是的,使用浮点运算实现不等式测试是可行的。而且,是的,由于浮点精度有限,这可能会给出 "error prone results"。
实际上根本没有必要使用浮点数。从数学上讲,"a/b > c/d" 的检验(假设 a、b、c、d 为正)等同于 "ad > bc" 的检验。对于无符号变量,您还需要考虑(或解决)模运算的影响(我将把它作为练习)但是完全不使用浮点数来完全实施测试是非常可行的。
我用所有通用算术函数(+
、-
、*
、/
、==
和 !=
)。
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>;
是否可以使用浮点运算实现剩余的关系运算符运算符(<
、>
、<=
、>=
),或者会导致容易出错的结果?
请注意,我只考虑了浮点数,因为交叉乘法在许多情况下会导致整数溢出。
是的,使用浮点运算实现不等式测试是可行的。而且,是的,由于浮点精度有限,这可能会给出 "error prone results"。
实际上根本没有必要使用浮点数。从数学上讲,"a/b > c/d" 的检验(假设 a、b、c、d 为正)等同于 "ad > bc" 的检验。对于无符号变量,您还需要考虑(或解决)模运算的影响(我将把它作为练习)但是完全不使用浮点数来完全实施测试是非常可行的。