在.net运行时为测试用例的目的散列一个浮点数

本文关键字:浮点数 一个 运行时 net 测试用例 | 更新日期: 2023-09-27 18:15:32

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

当我确信测试通过时,我对几何图形进行哈希。

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

计算涉及到浮点数的哈希值。通常,这将是一个错误的操作。然而,如果我将相同的数据输入到算法中,那么我将期望得到完全相同的结果,直至位级。这个期望是否有效,特别是如果我在中运行相同的测试。Net 4.5.1运行时在不同的CPU上,AMD vs INTEL, 64位vs 32位?

在.net运行时为测试用例的目的散列一个浮点数

假设一切都是相同的,那么即使浮点运算也是确定的,并且产生相同的结果…除非你最终在硬件或软件中发现了错误。

浮点数对执行顺序的变化是出了名的敏感,即使(尤其是!)在数学上不相关的情况下。如果版本之间的库有很小的差异,这可能会产生很小的差异,通常小到无法注意到。

所以,是的,人们可以想象结果在理论上可能会有所不同。但是,在实践中,基于结果将是相同的基础上继续进行是合理的(IMHO),但如果存在微小差异,则不会被摧毁。

由于IEEE 754,此期望无效;"浮点数"是近似值,因此在执行应该产生相同的数学运算后,不能期望在位上彼此相等。在很多例子中,在数学上应该与相同,但在使用浮点数时却不是这样;如果输入的不是相同的,那么结果的哈希值自然不会是。

我点评:

关于决定论:浮点误差有多确定?