这个想法是计算机是离散的,因此真正的无理变量不能用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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这只是一个例子.在任何实际情况中,都会应用GMP理性.这些理性将理性规范化为最低形式.
有三个主要原因"为什么不".如果它们都不适用,则有理数系统可能对您的应用程序有用:
pi平方根和trig函数等函数的值.无论如何你需要处理四舍五入,一般理性数字会失去很多吸引力.浮点数当然是合理的,但是在快速硬件中实现精心设计的舍入.如果您认为您的Rational类在科学和工程工作中具有可用的紧凑性和性能,我认为您应该使用它来运行LINPACK基准测试,尤其是LINPACK 1000,并将结果发布到使用浮点算法的类似系统的结果进行比较.LINPACK 1000次求解1000个联立线性方程组