0

我正在使用 Jon Skeet 的 Misc Util 库和 Marc 的 Operator 通用数学类。如果我正常进行数学运算,我会发现我不会发现的精度问题。

例如,与常规浮点类型运算符相比,在计算向量叉积时,我发现类似 .0001 的错误。

这是可以预料的吗?

[Test]
public static void Reproduce_OperatorT_Issue()
{
    float termFive = Operator<float>.Multiply(5.3f, 56.0f);
    float termSix = Operator<float>.Multiply(6.5f, 55.0f);

    float newZ = Operator<float>.Subtract(termFive, termSix);

    Assert.AreEqual(newZ, 5.3f * 56.0f - 6.5f * 55.0f);
}

输出:预期:-60.6999817f 但原为:-60.6999893f

4

1 回答 1

0

这似乎符合浮点类型的规范4.1.6 浮点类型 ,这是不幸的。如果需要,JIT 似乎会执行双精度,但我认为 JIT 不会对 Operator 中的那些表达式做同样的事情,这是我能对这些精度问题提出的唯一解释。

编辑:正如其他人在评论中指出的那样,C# 编译器、CLR 和 JIT 都可以自由控制浮点数以及它们对它们的作用,因此不能保证值是等效的。

于 2015-11-22T09:22:48.560 回答