`Rational`和`BigNum`实现之间有什么区别

时间:2016-08-12 13:00:15

标签: floating-point precision rational-number bignum arbitrary-precision

许多语言都有很多这样的类型。据我所知,这是它的工作原理。

Rational只为分子和分母存储两个独立的数字(如3和10表示0.3)。

BigNum将数字的每个数字存储在某种“数组”中,并像人们通常那样进行列算术。例如,0.1个商店,如[0,'。',1]。如果我们想添加0.2,它将导致如下:

  [0, '.', 1]
+ [0, '.', 2]
= [0, '.', 3]

我是对的吗?还有其他流行的任意精度算术吗?如果是这样,它怎么称呼?

我不是在讨论任何具体的实现,而是关于它通常做什么的一般概念。

1 个答案:

答案 0 :(得分:1)

广泛使用有几种不同的方法:

  • 任意精度整数通常存储为整数数组。示例包括long integers in PythonBigInteger in Javampz in the GMP library(以及使用GMP的Julia和Mathematica等语言)。

  • 任意精度浮点数存储为任意精度整数和指数。这可以是:

    • base-2(例如mpf in GMPMPFR和使用这些库的语言):在技术和数字方面往往受到青睐,因为它们的行为与普通浮点数完全相同,但具有更高的精度(所以可以用来验证方法或计算。)
    • base-10(例如BigDecimal in Javadecimal in Python。)倾向于受到金融应用的青睐(因为对货币四舍五入的担忧较少),以及无法获得他们的人围绕0.1 + 0.2 != 0.3这一事实(基于StackOverflow上不必要地提倡这些事件的频率)。
  • Rationals(例如mpq in GMPfractions in Python)将一个数字存储为(通常)任意精度整数的比率。这些很好,因为基本算术运算(+-*/)的结果总是精确的,即使像x/3这样的事情也是如此。缺点是它们不适用于非理性函数(例如sqrtsin),如果不小心使用它们会很快爆炸(例如,如果用于迭代算法,如牛顿的法)。

  • Double-double arithmetic将该数字存储为一对浮点数(通常为C double s,因此名称)。我们的想法是该对的第二个元素小于第一个元素的unit in last place,因此您可以有效地将可用精度加倍。这些想法可以追溯到Dekker (1971)的论文,可以扩展到三倍和四倍。优点是它们可以利用现有的浮点硬件,因此可以比任意精度浮点数快得多,但缺点是指数范围仍然与底层浮点格式相同(并且精度仍然是固定的,所以不是真的“武断”)。我不确定哪些库是常用的,但David Bailey对他的软件有很好的总结。