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 ?
Dies beantwortet welchen Teil der Frage genau? – weltensturm
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