Des*_*ume 10 c c++ floating-point performance arbitrary-precision
由于实现AP分数的方法有两种,一种是模拟double
数据类型的存储和行为,只有更多的字节,另一种是使用现有的整数APA实现来表示分数作为理性,即作为一对整数,分子和分母,这两种方式中的哪一种更有可能在性能方面提供有效的算术?(内存使用率确实很小.)
我知道现有的C/C++库,其中一些提供带有"浮点数"的小数APA和其他有理性的(不过它们都没有定点APA,但是当然我可以对依赖于"的库进行基准测试"浮动"对使用合理实现的实现进行实现,但结果很大程度上取决于我必须从近十个可用库中随机选择的那些特定库的实现细节.因此,我感兴趣的两种方法的理论优缺点(或者如果考虑定点APA则为三种).
问题是你在标题中提到的任意精度是什么意思.它是否意味着"任意,但在编译时预先确定并在运行时修复"?或者它是否意味着"无限,即在运行时可扩展以表示任何有理数"?
在前一种情况下(精确定制在编译时,但后来修复)我会说最有效的解决方案之一实际上是定点算术(即你提到的两个都没有).
首先,定点运算不需要任何专用库来进行基本算术运算.它只是一个覆盖整数运算的概念.这意味着如果你真的需要点之后的大量数字,你可以使用任何大整数库,将所有数据乘以2 ^ 64,你基本上可以立即获得64位二进制数字的定点运算. dot(至少与算术运算一样长,对乘法和除法进行一些额外的调整).这通常比浮点或合理表示更有效.
还要注意,在许多实际应用中,乘法运算通常伴随着x = y * a / b
对彼此"补偿" 的除法运算(如),这意味着通常不必对这样的乘法和除法进行任何调整.这也有助于定点运算的效率.
其次,定点算术在整个范围内提供统一的精度.对于浮点或合理表示,情况并非如此,在某些应用程序中,后两种方法可能是一个重大缺陷(或者是一种好处,取决于您的需要).
那么,再次,你为什么只考虑浮点和理性表示.有什么东西阻止你考虑定点表示吗?
由于似乎没有人提到这一点,有理数和浮点数代表不同的数字集。该值1/3
可以用有理数精确表示,但不能用浮点数表示。即使是任意精度浮点数也需要无限多个尾数位来表示像 这样的重复小数1/3
。这是因为浮点数实际上类似于有理数,但分母被限制为 2 的幂。任意精度有理数可以表示任意精度浮点数可以表示的所有内容,甚至更多,因为分母可以是任何整数而不仅仅是幂2。(也就是说,除非我严重误解了任意精度浮点数是如何实现的。)
这是为了回应您对理论利弊的提示。
我知道您没有询问内存使用情况,但这里有一个理论比较,以防其他人感兴趣。如上所述,有理数专门研究可以简单地用分数表示法表示的数字,例如1/3
或492113/203233
,而浮点数专门研究可以简单地用 2 的幂的科学记数法表示的数字,例如5*2^45
或91537*2^203233
。以各自的人类可读形式表示数字所需的 ASCII 键入量与其内存使用量成正比。
如果我有任何错误,请在评论中纠正我。