【问题标题】:fast arbitrary precision c++ library: is __float128 faster than MPFR?快速任意精度 c++ 库:__float128 比 MPFR 快吗?
【发布时间】:2012-10-29 07:10:34
【问题描述】:

我知道有几个关于类似主题的线程(What's the best (for speed) arbitrary-precision library for C++?The best cross platform (portable) arbitrary precision math library),我从这些线程中获取比 GMP 或基于它的东西,比如 MPFR 是最快的库,但我特别想知道:如果我只想说 30 dec 的位置,quadmath 库的 __float128 会更快吗?

另外,MAPM 如何与 MPFR 相提并论?

从这个网站看:

http://pari.math.u-bordeaux.fr/benchs/timings-mpfr.html

那个MPFR做的不错,但是还有CLN和apfloat?

【问题讨论】:

  • 附带说明(您可能已经意识到这一点,但只是为了确定),四精度浮点数不会给您约 30 个小数位,而是 113 个二进制位。
  • 我知道 quad 总共是 120 位,但我认为大概等于 30 分贝?
  • 你当然是对的(不过,它总共是 128 位)。我只是想让你记住,二进制浮点数不会给你实际的十进制精度。您很可能已经知道这一点,但只是为了确定。因此,不要指望您的 30 位精确十进制数以二进制四精度精确表示,它们只会大致相等彼此。
  • 双双库可能是最快的(比 float128 精度稍低,但使用 FPU),除非您有硬件 float128(我认为是一些 IBM 计算机)。但是,如果您需要许多奇怪的功能,可用性可能是您负担得起的唯一标准。

标签: c++ gmp bignum arbitrary-precision mpfr


【解决方案1】:

如果您只想要小数点后 30 位,我很确定(没有实际对其进行基准测试),GMP 或 MPFR 不能像一些简单的自制例程那样快。当然,这在一定程度上取决于您需要的操作。

这背后的原因是 GMP 等人。写得非常好,考虑到了非常大的整数(比如 1,000+ 甚至 1,000,000+ 十进制数字)。但是对于非常小的——但对于 int 来说太大——bignums,一些额外的 if、调用甚至内存分配的开销将在每个基准测试中杀死它们。

这是一个简单的练习,可以构建您自己的 C++ 函数,为您提供 2 个 64 位无符号的 128 位加法/减法。甚至乘法也很容易完成。除法可能没有那么简单,但你需要吗?更复杂的功能(根、日志等)需要更多的工作,然后是 GMP 等。也许会有回报。

【讨论】:

  • 感谢您的回复,不幸的是我确实需要复杂的功能。
  • 您到底需要什么?精度是多少?
  • 50-60dp 的精度以及从 log、abs、pow、roots 等几乎所有内容。
  • 只要结果还是整数,平方根和立方根,对数和整数幂都不是太难。有关详细信息,请参阅 H S Warren 的“黑客的喜悦”。
  • 问题是关于 MPFR 和 __float128。为什么这个答案是关于整数和整数运算的?
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多