c++ - C++/Haskell 中的精确算术和惰性列表性能

标签 c++ math haskell lazy-evaluation arbitrary-precision

在阅读 this paper 后,我最近遇到了精确实数运算这一主题。和 this paper .

我找到了许多讨论使用有符号数字流实现精确算术的论文。对任意精度使用无限流可以在函数式语言(如 Haskell)中使用惰性列表实现很好的实际实现。但是,讨论函数式语言中此类实现的论文似乎得出的结论是性能非常差。

现在,我意识到与标准浮点表示相比,精确的非硬件实现通常具有相对较差的性能,但我有兴趣以命令式语言(特别是 C++)和运算/函数的集合(算术运算、三角函数、exp、log 等)。

我的问题:有符号数字/惰性流表示是否存在固有的缓慢导致性能不佳的问题,还是 Haskell?是什么让它变慢?是否有可能在 C++ 中使用惰性流实现有符号数字流表示,从而实现(显着)比其 Haskell 对应物更好的性能,或者这是徒劳的练习?也许重构为迭代?

我知道有两个 C++ 库 RealLib 和 iRRAM 可以实现高效的实数计算。但是,这些似乎使用区间算术,将实数表示为缩小的嵌套区间,这似乎不像无限流那样“纯”一种方法(如果您不同意,请纠正我!)。但也许只有这些方法才能实现高效率?

感谢任何输入!

最佳答案

is there something inherently slow about a signed digit/lazy stream representation that causes the bad performance, or is it Haskell? What is it that makes it slow? Would it be possible to implement a signed digit stream representation using lazy streams in C++ that achieves (significantly) better performance than its Haskell counterpart, or is this an exercise in futility? Perhaps reconstructing as iterations?

惰性流最有效地表示为具有延迟函数组件的数据。这就是 GHC 中相当高效的 Haskell 实现所使用的表示形式,无论如何您都需要在 C++ 中使用它。没有可以用 C++ 编写的特殊“快速”版本的惰性,这在 Haskell 编译器研究的 20 年中还没有尝试过,更多的可以追溯到 Algol。

有关如何最有效地实现惰性数据结构的研究的更多详细信息,请参阅 Good introductory text about GHC implementation?

现在,由于缺乏有关基准的信息,有几个可能的答案:

  • 代码写得不好(更好的实现可能不会很慢)
  • 将大数字表示为标记的惰性位会导致空间效率低下,从而导致各种硬件瓶颈
  • 数字的惰性流表示只允许某些线性算法。更密集的表示可能会接受具有更好复杂性或绝对性能的算法。

我的猜测是后两点。 C++ 版本的惰性只会很难达到 GHC 已经在的同一点,所以为什么不玩一下文章中的代码,看看你是否可以让它更快。

关于c++ - C++/Haskell 中的精确算术和惰性列表性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236833/

相关文章:

python - 关于karatsuba乘法的问题

haskell - 快速计算列表中的已知元素

c++ - 看看我们是否可以得到回文

php - 在两个应用程序之间传输大量数据的最快方式

c++ - 内联虚函数

c++ - 乒乓物理题

c++ - 用小数字代替零?

haskell - 使用 DataKinds 扩展时如何导出类型构造函数?

performance - 使用无限列表时执行速度较慢

c++ - 管理多个项目的 C++ 依赖关系