确保 .NET 中的浮点确定性
尽管浮点确定性很重要,但 .NET 缺乏明确的选项来强制执行它。然而,最近的讨论提出了一个潜在的解决方案:通过显式强制转换将浮点值强制返回其本机精度。
显式转换作为确定性机制
根据CLR 工程师 David Notario,显式转换应该触发插入诸如 conv.r4 之类的缩小指令,有效地强制将值截断为其本机值 尺寸。这表明将所有表达式和子表达式转换为 float 将确保确定性结果。
运行时的“提示”
但是,Eric Lippert 的声明暗示了细微差别铸造工艺。他声称 C# 编译器在发生显式转换时向运行时提供“提示”。他建议,这个提示告诉运行时终止任何高精度模式计算。
编译器和 CLR 规范
经检查,C# 规范没有明确指出提到显式强制转换会强制插入 conv.r4。然而,编译器中的单元测试证实了这种行为。另一方面,CLR 规范明确指出 conv.r4 将值截断为其原始大小。
截断保证
虽然显式转换可确保截断,但它确实不保证跨机器的可重复结果。其他因素(例如 FPU/SSE 设置)可能会影响浮点运算的行为。 CLR 规范第 12.1.3 节讨论了非正规数和 NaN 的含义。
替代方法
除了显式转换之外,还可以为数组赋值 (double[]或 float[]),或者静态或实例字段也会截断浮点值。然而,为了真正可重现的算术,建议使用整数。
以上是显式转换如何确保 .NET 中的浮点确定性?的详细内容。更多信息请关注PHP中文网其他相关文章!