在派生计算上下文中,我需要确保x和x + h之间有一个完全可表示的数字,所以我这样做了:
var temp = x + deltaX;
DoNothing(temp);
deltaX = temp - x;
DoNothing()方法存在,以防止temp被优化掉。
这是处理这个问题的正确方法吗?
答案 0 :(得分:4)
您担心的编译器优化对.NET无效。它已知用C ++完成,快速数学和#34;编译器设置。 .NET保证IEEE浮点行为,但允许过多的精度(这里不是问题)。优化将是一般的价值变化,因此它是被禁止的。
如果你想清除编译器对值的了解,我总是使用:
[MethodImplOptions(NoInlining)]
T F<T>(T x) { return x; }
这不能保证有效,但它适用于目前存在的所有JIT。 .NET JIT在优化方面非常薄弱,我怀疑它们会添加那种会使这个技巧停止运行的数据流分析。