比较D中的浮点数

时间:2016-06-06 13:55:15

标签: floating-point d

我目前正在实施Quaternions,我遇到了以下问题

unittest{
    auto q1 = Quaternion(Vec3f(1, 0, 0), Degrees(90));
    writeln("length ", q1.magnitude);
    assert(q1.magnitude is 1.0f);
}

它打印1但断言失败,这意味着该值非常接近1但不完全正确。

在我的矢量代码中,我总是使用以下apporach

/**
      Compares two vectors with a tolerance value, if the type of the vector
      is a floating pointer number.
*/
bool equals(Vec, T = Vec.Type)(const Vec v1, const Vec v2, T tolerance = kindaSmallNumber)
if(isVector!Vec && isFloatingPoint!(Vec.Type)){
    import std.math: abs;
    import breeze.meta: zip;
    import std.algorithm.iteration: map;
    import std.algorithm.searching: all;
    return zip(v1.data[], v2.data[]).map!(t => abs(t[0] - t[1]) < kindaSmallNumber).all;
}

我基本上abs( a - b ) < tolerance

我可以将此概括为类似

bool equalsf(float a, float b, float tolerance = 0.00001){
    import std.math: abs;
    return abs( a - b ) < tolerance;
}

然后我可以重写

unittest{
    auto q1 = Quaternion(Vec3f(1, 0, 0), Degrees(90));
    assert(q1.magnitude.equalsf(1.0f));
}

但现在我想知道是否已经有一种比较D中浮点数的标准方法?

2 个答案:

答案 0 :(得分:4)

您可以使用标准库中的approxEqual功能

答案 1 :(得分:0)

查看gfmgl3nm3d它们都提供了向量和四元数类型。