在阅读 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/