为什么不使用扩展的理性而不是浮点数/双打?

时间:2014-07-26 14:10:22

标签: floating-point

为什么不将扩展的有理数用于浮点表示?

这个想法是计算机是离散的,因此真正的无理变量不能用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理性。这些理性将理性规范化为最低形式。

1 个答案:

答案 0 :(得分:6)

有三个主要原因&#34;为什么不&#34;。如果它们都不适用,则有理数系统可能对您的应用程序有用:

  1. 紧。它只需要8个字节来存储一个double,4个字节用于float。如果你正在处理其中的一个或两个,这并不重要。它对于具有数千行和列的矩阵很重要。
  2. 性能。正如Pascal Cuoq在对该问题的评论中指出的那样,现代计算机上许多重要的浮点运算都非常快。
  3. 需要近似无理数,例如pi以及平方根和trig函数等函数的值。无论如何你需要处理四舍五入,一般理性数字会失去很多吸引力。浮点数当然是合理的,但是在快速硬件中实现精心设计的舍入。
  4. 如果您认为您的Rational类在科学和工程工作中具有可用的紧凑性和性能,我认为您应该使用它来运行LINPACK benchmarks,尤其是LINPACK 1000,并将结果发布以便与类似系统的结果进行比较使用浮点运算。 LINPACK 1000次求解1000个联立线性方程组的系统