2016-06-06 12 views
3

ich zur Zeit ist die Umsetzung Quaternionen und ich laufe in das folgende ProblemVergleich Gleitkommazahlen in D

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

Wo es druckt 1 aber die Assertion fehlschlägt, was bedeutet, der Wert auf 1 ganz in der Nähe, aber nicht genau.

In meinem Vektorcode Früher habe ich immer folgende 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; 
} 

Wo ich im Grunde abs(a - b) < tolerance tun.

ich könnte dies zu etwas verallgemeinern wie diese

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

und dann konnte ich

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

umschreiben Aber jetzt frage ich mich, ob es zu vergleichen Gleitkommazahlen in D bereits eine Standardmethode ist ?

Antwort

0

haben einen Blick auf gfm, gl3n oder m3d sie alle bieten einen Vektor und quaternion Typ.

+0

Dies beantwortet welchen Teil der Frage genau? – weltensturm

+0

beantwortet es die Meta-Frage. dass der Autor das Rad nicht neu erfinden sollte. Außerdem wurde auf der diesjährigen DConf über Gleitkomma-Mathematik und vor allem Vergleich gesprochen. Lange Rede, kurzer Sinn, vergleiche die Gleichheit der Floats nicht. – burner