4

无论我是否在调试器下运行,我都在使用调试版本并在同一台机器上获得不同的结果。我正在使用优秀的 TestDriven.Net 来运行单元测试。

  • 使用 TestDriven.Net 或外部 NUnit 运行器“运行”会产生相同的结果
  • 使用 TestDriven.Net “使用调试器运行”会产生不同的结果

代码是

  • 一个复杂的迭代网格变形例程,涉及在浮点精度限制下的大量计算
  • C#, VS2012 针对.Net 3.5。
  • 单线程
  • 仅调试构建,未构建发布版本
  • 同一台机器,没有省电\speedstep 或我知道的其他功能
  • Vanilla C# - 没有不安全的代码、非托管库、平台调用等。
  • 没有调试器检查代码或奇怪的第三方库

我还没有追溯到第一个差异(没有调试器就很棘手!)但是考虑到代码的迭代性,它的输入敏感和最小的差异将在足够的时间下增长到显着的比例。

我知道跨编译器、平台和体系结构的 fp 可重复性是多么脆弱,但很失望地发现调试器是造成这种情况的因素之一。

我是否必须接受这是生活中的事实,还是您可以提供任何建议?

4

1 回答 1

9

我是否必须接受这是生活中的事实,还是您可以提供任何建议?

你必须接受它作为生活的事实。浮点代码可以在不同的情况下进行不同的优化。特别是,在某些情况下,JIT 编译器可以使用具有更高精度/准确度的表示(例如 80 位浮点)进行操作。JIT 编译器执行此操作的情况取决于体系结构、优化设置等。关于变量(以及它是否为局部变量)的操作可能存在许多微妙之处,这些都会影响到这一点。在调试器下运行通常会非常显着地影响 JIT 优化设置 - 不仅仅是浮点 - 所以我对此一点也不感到惊讶。

如果您以一定的容差执行浮点比较,那应该没问题 -无论如何,对浮点类型进行精确相等比较几乎不是一个好主意。当然,您实际上可能正在执行不等式比较,其中差异变得显着,但我很少遇到这个问题。

于 2013-08-24T11:12:23.770 回答