0

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

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

BigNum将数字的每个数字存储在某种“数组”中,并像人类通常做的那样进行列算术。例如,0.1 个商店,如 [0, '.', 1]。如果我们想给它加上 0.2,它会产生这样的结果:

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

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

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

4

1 回答 1

1

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

  • 任意精度整数通常存储为整数数组。示例是Python 、JavaGMP 库(以及使用 GMP 的语言,如 Julia 和 Mathematica)中的长整数。BigIntegermpz

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

    • base-2(例如mpf在 GMPMPFR和使用这些库的语言中):在技术和数值领域往往受到青睐,因为它们的行为与普通浮点数完全相同,但具有更高的精度(因此可用于验证方法或计算) .
    • base-10(例如BigDecimal在 Java中,decimal在 Python 中。)倾向于受到金融应用程序的青睐(因为对货币四舍五入的担忧较少),以及无法理解这一事实的人0.1 + 0.2 != 0.3(基于StackOverflow 上不必要地提倡这些的频率)。
  • 有理数(例如mpq在 GMP中,fractions在 Python 中)将数字存储为(通常)任意精度整数的比率。这些都很好,因为基本算术运算(+, -, *, /)的结果总是准确的,即使是x/3. 缺点是它们不适用于非有理函数(例如sqrtor sin),如果不小心使用(例如,如果在迭代算法中使用,例如牛顿法),它们会很快崩溃。

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

于 2016-08-15T20:29:24.780 回答