abe*_*nci 4 .net c# unit-testing visual-studio-2010 visual-studio
我们有一些单元测试可以检查方程线性系统解的结果,比较浮点数和delta.
尝试调整增量,我注意到Visual Studio Run test和Debug test模式之间的相同数字略有变化.
为什么会这样?当我调试测试时,#if DEBUG部分被禁用,因此执行的代码应该是相同的.
谢谢.
ang*_*son 10
有关在典型DEBUG和RELEASE构建(未优化与优化)之间产生不同结果的代码的简单示例,请在LINQPad中尝试:
void Main()
{
float a = 10.0f / 3;
float b = 10;
b /= 3;
(a == b).Dump();
(a - b).Dump();
}
Run Code Online (Sandbox Code Playgroud)
如果你在优化的情况下执行此操作(确保LINQPad窗口中的小按钮一直向下转到"/ o +"),你将得到以下结果:
False
-7,947286E-08
Run Code Online (Sandbox Code Playgroud)
如果你禁用它,关闭优化,你得到这个:
True
0
Run Code Online (Sandbox Code Playgroud)
请注意,生成的IL代码是相同的:

请注意,地址不同,这可能表明除了纯IL之外还有其他的东西,尽管我不知道它可能是什么.
有各种各样的事情可以影响浮点计算,其中最重要的是它是否实际将值写入本地/字段.对于优化构建,JIT可以将值保存在寄存器中 - FPU寄存器为80位宽,以最大限度地减少累积错误.如果它需要实际将值写入32位(float)或64位(double)本地或字段,则必然会丢失其中的一部分.所以,是的,如果它可以完成寄存器中的所有工作 - 它可以提供不同的(通常更"正确")结果,而不是将中间值写入本地等.
还有其他可用的寄存器,但我怀疑它们在这里使用:XMM/SSE寄存器是128位; SIMD可以(取决于机器)最多512位.
甚至 Visual StudioCtrl+F5也会F5产生不同的浮点值。Release打印准确值的唯一选项是在模式下运行且没有 Visual Studio 的情况下从代码创建文本文件( Ctrl+F5)。不同的机器会产生不同的浮点值,因此由您决定在哪里生成它。
这样你所有的浮点数都会完全匹配!
| 归档时间: |
|
| 查看次数: |
2684 次 |
| 最近记录: |