相关疑难解决方法(0)

CLR JIT优化是否违反了因果关系?

我正在为一位同事写一个有启发性的例子,告诉他为什么测试花车的平等往往是个坏主意.我去的例子是添加0.1十次,对1.0(我在我的介绍数值类所示)进行比较.我惊讶地发现两个结果是相同的(代码+输出).

float @float = 0.0f;
for(int @int = 0; @int < 10; @int += 1)
{
    @float += 0.1f;
}
Console.WriteLine(@float == 1.0f);
Run Code Online (Sandbox Code Playgroud)

一些调查表明,这个结果不能依赖(很像浮动平等).我发现最令人惊讶的是在其他代码之后添加代码可能会改变计算结果(代码+输出).请注意,此示例具有完全相同的代码和IL,并附加了一行C#.

float @float = 0.0f;
for(int @int = 0; @int < 10; @int += 1)
{
    @float += 0.1f;
}
Console.WriteLine(@float == 1.0f);
Console.WriteLine(@float.ToString("G9"));
Run Code Online (Sandbox Code Playgroud)

我知道我不应该在花车上使用平等,因此不应该太在意这一点,但我发现它非常令人惊讶,就像我向大家证明的那样.做的东西后,您进行了计算改变了先前计算的价值?我不认为这是人们通常在脑海中计算的模型.

我不是完全难住了,似乎是安全的假设,有某种优化的改变计算的结果,"平等"的情况下发生的(建筑在调试模式防止"平等"的情况下).显然,当CLR发现稍后需要将浮动框打包时,优化​​被放弃.

我搜索了一下但找不到这种行为的原因.任何人都能提醒我吗?

.net floating-point clr equality ieee-754

14
推荐指数
2
解决办法
1419
查看次数

C#XNA Visual Studio:"发布"和"调试"模式之间的区别?

我正在研究一个关于碰撞检测的演示.(这里详细说明了一些代码.)在调试模式下,它工作正常.在释放模式下,它更快,但碰撞检测真的搞砸了.物体没有任何反弹,或者似乎被重力奇怪地轻微影响.有些物体爆炸,好像它们与特殊爆炸物体相撞,即使这些物体都不存在.

那么...... Visual Studio在Release和Debug模式之间改变了什么导致了这个问题呢?(我正在使用VS Pro 2008.)

神秘的是,发布模式一直在努力进行大量的开发.它刚刚停止了.

c# xna visual-studio-2008

7
推荐指数
2
解决办法
3059
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

equality ×1

floating-point ×1

ieee-754 ×1

visual-studio-2008 ×1

xna ×1