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

Ult*_*awk 1 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这只是一个例子.在任何实际情况中,都会应用GMP理性.这些理性将理性规范化为最低形式.

Pat*_*han 6

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

  1. 紧凑.它只需要8个字节来存储一个double,4个字节用于float.如果你正在处理其中的一个或两个,这并不重要.它对于具有数千行和列的矩阵很重要.
  2. 性能.正如Pascal Cuoq在对该问题的评论中指出的那样,许多重要的浮点运算在现代计算机上都非常快.
  3. 需要近似无理数,例如pi平方根和trig函数等函数的值.无论如何你需要处理四舍五入,一般理性数字会失去很多吸引力.浮点数当然是合理的,但是在快速硬件中实现精心设计的舍入.

如果您认为您的Rational类在科学和工程工作中具有可用的紧凑性和性能,我认为您应该使用它来运行LINPACK基准测试,尤其是LINPACK 1000,并将结果发布到使用浮点算法的类似系统的结果进行比较.LINPACK 1000次求解1000个联立线性方程组