这个想法是计算机是离散的,因此真正的无理变量不能用float或double类型表示。事实上,我认为构成浮点数的任何有限数字序列都具有合理的同义词。甚至一些无限序列也具有此属性。因此,为什么不使用理性?它似乎更容易,特别是支持更大的数字。我在这里天真吗?为什么我们需要浮动(部分)合理实现?
#include <iostream>
class Rational
{
public:
Rational (int numerator, int denominator, int exponent)
:
m_numerator(numerator),
m_denominator(denominator),
m_exponent(exponent)
{}
friend Rational operator* (const Rational &lhs, const Rational &rhs);
friend std::ostream &operator<< (std::ostream &os, const Rational &out);
private:
int m_numerator, m_denominator, m_exponent;
};
Rational operator* (const Rational &lhs, const Rational &rhs)
{
Rational tmp = lhs;
tmp.m_numerator *= rhs.m_numerator;
tmp.m_denominator *= rhs.m_denominator;
tmp.m_exponent += rhs.m_exponent;
return tmp;
}
std::ostream &operator<< (std::ostream &os, const Rational &out)
{
os << out.m_numerator << "/" << out.m_denominator << "E" << out.m_exponent;
return os;
}
int main ( int argc, char *argv[] )
{
Rational a(1, 3, 10), b(4, 7, -5);
Rational c = a * b;
std::cout << c << std::endl;
}
编辑:
这仅仅是示例。在任何实际情况中,都会应用GMP理性。这些理性将理性规范化为最低形式。
答案 0 :(得分:6)
有三个主要原因&#34;为什么不&#34;。如果它们都不适用,则有理数系统可能对您的应用程序有用:
pi
以及平方根和trig函数等函数的值。无论如何你需要处理四舍五入,一般理性数字会失去很多吸引力。浮点数当然是合理的,但是在快速硬件中实现精心设计的舍入。如果您认为您的Rational类在科学和工程工作中具有可用的紧凑性和性能,我认为您应该使用它来运行LINPACK benchmarks,尤其是LINPACK 1000,并将结果发布以便与类似系统的结果进行比较使用浮点运算。 LINPACK 1000次求解1000个联立线性方程组的系统