在 .NET 中强制浮点计算以获得确定性结果
在 .NET 中追求跨机器的一致结果的推动下,开发人员努力解决以下问题面对浮点决定论的挑战。如果没有像 Java 的 fpstrict 这样的内置解决方案,这个问题似乎是无法克服的。虽然有些人诉诸于繁琐的定点数学,但另一些人则探索了显式转换的潜力。
正如 CLR 工程师 David Notario 所建议的,在每个浮点运算后插入显式转换可能会导致可预测的行为。然而,Eric Lippert 警告说,C# 编译器只是向运行时提供“提示”以启用缩小范围。目前尚不清楚此提示是否会转换为必要的 IL 转换。
深入研究 C# 规范和 CLR 规范,我们确认:
尽管如此,仅显式转换不足以保证跨机器的可重复性。 CLR 可能允许在中间计算期间将结果存储在更高精度的 FPU 寄存器中。分配给静态字段或数组元素也可能会强制截断。
其他因素(例如 FPU 设置)仍然可能会引入变化。为了确保真正可重复的算术,建议开发人员考虑使用整数。
以上是我们如何在 .NET 中实现确定性浮点结果?的详细内容。更多信息请关注PHP中文网其他相关文章!