【问题标题】:hashing a floating point number for test case purposes in the .Net runtime在 .Net 运行时中为测试用例目的散列浮点数
【发布时间】:2014-09-22 04:41:51
【问题描述】:

我有带有几何实体的复杂测试用例。通过在视口中查看生成的几何图形,我很容易直观地验证测试用例是否通过。

当我对测试通过感到满意时,我会对几何图形进行哈希处理。

var hashCode = GetHashCodeForRegionResult(region);
hashCode.Should().Be(1243932659);

计算涉及对浮点数进行哈希处理。通常这是一件的事情。但是,如果我将 same 数据输入到算法中,那么我会期望在位级别上得到完全相同的结果。这种期望是否有效,特别是如果我在不同 CPU、AMD 与 INTEL、64 位与 32 位的 .Net 4.5.1 运行时 中运行相同的测试?

【问题讨论】:

  • 我认为这个问题可以简化为:相同的 C# 或 IL 是否总是会产生完全相同的浮点结果(给定相同的输入)?我认为我们不需要在这里考虑散列。好问题。
  • 你是对的,感谢您的澄清。
  • 我不知道您的问题的答案,但请注意,有正零和负零。对实现的无害更改可能会导致获得其中之一。他们有不同的表示。除此之外,我认为答案是“是”;也许如果你在找到浮点数的散列之前添加零,你会得到想要的结果。

标签: c# .net testing hash floating-point


【解决方案1】:

这种预期无效,因为IEEE 754;“浮点数”是近似值,因此在执行应该的数学运算后,不能预期彼此按位等效> 导致相同。在很多例子中,数学上应该是相同的——但在使用浮点数时则不然;如果输入不同相同,那么结果的散列自然不会是。

我会评论:

关于确定性: How deterministic is floating point inaccuracy?

【讨论】:

  • 但是结果是确定性的吗? IEEE 浮点数被定义为确定性的。
  • 这不是我要问的。我在问具有相同输入的相同代码是否总是会返回相同的结果。等效的测试是查看您的代码每次在 .Net 支持的每个平台上运行时是否返回 -4.57966997657877E-16
  • 你的代码演示了什么?您是否声称它表明相同的浮点数并不总是得到相同的哈希值?因为这是(很短)被问到的问题……
  • System.Double 是否也有同样的问题?我想我遇到了一个类似的问题,在数学 GetHashCode() 产生不同的值之后。
【解决方案2】:

假设一切都是相同的,那么您甚至会期望浮点运算也是确定性的,并产生相同的结果...除非您最终发现硬件或软件中的错误。

众所周知,浮点对执行顺序的变化非常敏感,即使(尤其是!)这在数学上无关紧要。如果版本之间的库存在细微差异,则可能会产生细微差异,通常太小而无法注意到。

所以,是的,我们可以想象结果在理论上会以何种方式发生变化。但是,在实际结果相同的基础上继续进行是合理的(恕我直言)——但如果存在微小差异,也不会被破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 2019-11-29
    • 2011-04-16
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多