我的目标是在可能具有不同 CPU 架构和操作系统的不同机器上运行需要非整数的模拟。主要优先级是给定相同的初始状态,每台机器都应该完全相同地再现模拟。次要优先级是我希望计算的性能和精度尽可能接近双精度浮点数。
据我所知,似乎没有任何方法可以从 Haskell 程序中影响浮点计算的确定性,类似于 C 中的_controlfp
and_FPU_SETCW
宏。所以,目前我认为我的选择是
- 使用数据.比率
- 使用数据。固定
- 使用定点包中的Data.Fixed.Binary
- 编写一个模块以
_ controlfp
通过 FFI 调用(或每个平台的等效模块)。 - 可能,还有别的?
定点算术库的一个问题是它们没有为它们定义例如三角函数或对数(因为它们没有实现Floating
类型类)所以我想我需要为所有函数提供查找表模拟种子数据。或者有什么更好的方法吗?
两个定点库也隐藏了newtype
构造函数,因此据我所知,任何(反)序列化都需要通过toRational
/来完成fromRational
,这感觉会增加不必要的开销。
我的下一步是对不同的定点解决方案进行基准测试,以了解真实世界的性能,但与此同时,我很乐意听取您对此主题的任何建议。