C#Misc Utils - 运算符<t>通用数学精度问题

时间:2015-11-22 06:47:58

标签: c# precision miscutils

我正在使用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

1 个答案:

答案 0 :(得分:0)

这似乎符合浮动类型4.1.6 Floating point types的规范 这是不幸的。如果需要,JIT似乎可以做双精度但是我认为JIT对于运算符中的那些表达式不会做同样的事情,这是我能为这些精度问题提出的唯一解释。

编辑:正如评论中的其他人所指出的那样,C#编译器,CLR和JIT都可以自由地控制浮点数以及它们对它们的作用,因此没有承诺值将是等价的。