许多语言都有很多这样的类型。据我所知,这是它的工作原理。
Rational
只为分子和分母存储两个独立的数字(如3和10表示0.3)。
BigNum
将数字的每个数字存储在某种“数组”中,并像人们通常那样进行列算术。例如,0.1个商店,如[0,'。',1]。如果我们想添加0.2,它将导致如下:
[0, '.', 1]
+ [0, '.', 2]
= [0, '.', 3]
我是对的吗?还有其他流行的任意精度算术吗?如果是这样,它怎么称呼?
我不是在讨论任何具体的实现,而是关于它通常做什么的一般概念。
答案 0 :(得分:1)
广泛使用有几种不同的方法:
任意精度整数通常存储为整数数组。示例包括long integers in Python,BigInteger
in Java或mpz
in the GMP library(以及使用GMP的Julia和Mathematica等语言)。
任意精度浮点数存储为任意精度整数和指数。这可以是:
mpf
in GMP,MPFR和使用这些库的语言):在技术和数字方面往往受到青睐,因为它们的行为与普通浮点数完全相同,但具有更高的精度(所以可以用来验证方法或计算。)BigDecimal
in Java,decimal
in Python。)倾向于受到金融应用的青睐(因为对货币四舍五入的担忧较少),以及无法获得他们的人围绕0.1 + 0.2 != 0.3
这一事实(基于StackOverflow上不必要地提倡这些事件的频率)。 Rationals(例如mpq
in GMP,fractions
in Python)将一个数字存储为(通常)任意精度整数的比率。这些很好,因为基本算术运算(+
,-
,*
,/
)的结果总是精确的,即使像x/3
这样的事情也是如此。缺点是它们不适用于非理性函数(例如sqrt
或sin
),如果不小心使用它们会很快爆炸(例如,如果用于迭代算法,如牛顿的法)。
Double-double arithmetic将该数字存储为一对浮点数(通常为C double
s,因此名称)。我们的想法是该对的第二个元素小于第一个元素的unit in last place,因此您可以有效地将可用精度加倍。这些想法可以追溯到Dekker (1971)的论文,可以扩展到三倍和四倍。优点是它们可以利用现有的浮点硬件,因此可以比任意精度浮点数快得多,但缺点是指数范围仍然与底层浮点格式相同(并且精度仍然是固定的,所以不是真的“武断”)。我不确定哪些库是常用的,但David Bailey对他的软件有很好的总结。