【发布时间】:2011-12-29 10:12:52
【问题描述】:
假设我有这样的事情:
for (int i = 0; i < 1001; i++)
{
double step = i / 1000.0;
// do some math here
}
基本上是转向:
double step = i / 1000.0;
进入这个:
double step = i * 0.001;
我不确定是否可以在不更改程序结果的情况下进行这种更改,但想知道 C# 编译器或抖动是否会这样做?如果不是,为什么?我认为要么不值得,要么他们还没有添加此优化。
【问题讨论】:
-
第一个必须是 i / 1000.0。否则,除法完全以整数完成,结果始终为零或一。
-
由于
1/1000不能在 IEEE-754 中精确表示:您基本上是在问:“JIT 会为 fp 数学更快地产生不精确的结果吗?”。这并不是那么荒谬,因为 C++ 编译器长期以来一直包含非严格的数学模式(虽然不知道他们是否会做这样的优化),所以谁知道呢。您必须阅读语言规范才能确定,但我认为这不太可能。
标签: c# .net optimization compiler-construction jit