快速C代码用于简单的固定(多)精度操作(add,div,mul,sub)?

时间:2013-05-08 10:45:41

标签: c assembly arbitrary-precision

我一直在编写一些cython代码来实现我想在python中使用的多精度数组操作(主要是点积和矩阵求逆)。我使用mpfr作为底层C库,并通过在C和Cython中测试,我发现mpfr(精度为200位)比numpy(机器精度)慢50-200倍(取决于操作)。我知道mpfr非常快,但我仍然发现这个开销非常大。因为我的需求非常有限(固定精度,只有基本操作,如add,mult等等。)我想知道我是否可以手工编写一些多精度操作(无论仔细舍入等等)。不幸的是,这涉及到相当多的工作,所以我希望在C或英特尔组件中找到一些免费的代码片段来进行基本的多精度算术。我要感谢对后者的任何提及,或者为什么我应该或不应该采用这种方法。

更新:我应该提到我已经尝试过QD库,它实际上(略微)比MPFR慢,速度相近(212位)。我想这肯定是由于C ++开销。

1 个答案:

答案 0 :(得分:4)

您可以尝试使用double-doublequad-double库。这些库利用现有的双精度硬件来提高速度(我将摘要写成了我自己的question的一部分)。后者似乎有code

这些库要求底层硬件按照IEEE 754标准的要求运行完全。如果以过高的精度进行计算,它们会分解。如果您的目标是现代桌面处理器,请确保您的编译器为浮点计算生成SSE2指令。如果由于某种原因你被困在8087指令中,最好使用双倍扩展库(数字表示为两个80位数字的总和)。 CRlibm内有一个应该没有太多工作就可以出来。


或者,可能值得尝试GMP的MPF类型。它可能会更快,因为它不会像MPFR according to the latter's FAQ一样好。