比较有理数
Comparing Rational Numbers
我用所有的一般算术函数(+
、-
、*
、/
、==
和!=
)制作了以下有理数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>;
使用浮点运算实现剩余的关系运算符(<
、>
、<=
、>=
)是否可行,或者这会导致容易出错的结果?
注意,我只考虑了浮点,因为交叉乘法在许多情况下可能导致整数溢出。
是的,使用浮点运算实现不等式的测试是可行的。是的,由于浮点的精度有限,这可能会产生"容易出错的结果"。
实际上根本没有必要使用浮点。从数学上讲,"a/b>c/d"的测试(假设a、b、c、d为阳性)相当于测试"ad>bc"。对于无符号变量,您还需要考虑(或解决)模运算的影响(我将把做这件事作为练习),但完全不使用浮点来实现测试是非常可行的。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- 对于循环变体比较
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 比较有理数