W
walkietalkie74
Hi all,
Sorry if this question has been already asked in the past (I bet so). I would appreciate if you could point me in the right direction.
I do not generally compare doubles because I am well aware of the round-offerrors that make such a comparison meaningless.
However, I am trying to write my program in a test-driven way, so I'd like to write a tester that checks that the result of a specific calculation is actually zero.
My code is the one below. It's calculating a straight line equation based on a point and a vector (in space, a straight line is the intersection of two planes, hence the getPlane1() and getPlane2()), and is checking whether the obtained equation is correct by calculating arbitrary points that are supposed to be on the same straight line, and checking whether their coordinates solve the plane equations:
bool GeometryTester::runTests() {
Point p(2, -2, 1);
Vector v(2, 4, 2);
StraightLine straightLine = Geometry::getStraightLine(p, v);
bool result = true;
for (double scalar = -10.0; scalar <= 10.0; scalar += 0.11131719) {
Point calcPoint = Geometry::getPoint(p, v, scalar);
double s1 = straightLine.getPlane1().solve(calcPoint.getX(),
calcPoint.getY(),
calcPoint.getZ());
double s2 = straightLine.getPlane2().solve(calcPoint.getX(),
calcPoint.getY(),
calcPoint.getZ());
result = result &&
MathComparer::equalsZero(s1);
result = result &&
MathComparer::equalsZero(s2);
}
return result;
}
For now, in MathComparer::equalsZero(), I am using a (wrong - I know) direct == comparison between the argument passed in and 0.0, but I'd like toreplace it with the appropriate comparison using an epsilon.
Am I correct in thinking that the epsilon should actually be chosen depending on the current calculation and the accuracy I am expecting from it?
I can see, for example, that the solve() method most of the times returns 0..0 but at times something like 6e-12 (which is absolutely sensible, given the imprecise nature of floating-pint types).
Would it be sensible to pass in an arbitrary epsilon to the equalsZero() function?
I have seen examples of usage of std::numerics<double>::epsilon but I am not sure how it should be used in my case...
Can you help me understand this stuff better?
Thanks!
Sorry if this question has been already asked in the past (I bet so). I would appreciate if you could point me in the right direction.
I do not generally compare doubles because I am well aware of the round-offerrors that make such a comparison meaningless.
However, I am trying to write my program in a test-driven way, so I'd like to write a tester that checks that the result of a specific calculation is actually zero.
My code is the one below. It's calculating a straight line equation based on a point and a vector (in space, a straight line is the intersection of two planes, hence the getPlane1() and getPlane2()), and is checking whether the obtained equation is correct by calculating arbitrary points that are supposed to be on the same straight line, and checking whether their coordinates solve the plane equations:
bool GeometryTester::runTests() {
Point p(2, -2, 1);
Vector v(2, 4, 2);
StraightLine straightLine = Geometry::getStraightLine(p, v);
bool result = true;
for (double scalar = -10.0; scalar <= 10.0; scalar += 0.11131719) {
Point calcPoint = Geometry::getPoint(p, v, scalar);
double s1 = straightLine.getPlane1().solve(calcPoint.getX(),
calcPoint.getY(),
calcPoint.getZ());
double s2 = straightLine.getPlane2().solve(calcPoint.getX(),
calcPoint.getY(),
calcPoint.getZ());
result = result &&
MathComparer::equalsZero(s1);
result = result &&
MathComparer::equalsZero(s2);
}
return result;
}
For now, in MathComparer::equalsZero(), I am using a (wrong - I know) direct == comparison between the argument passed in and 0.0, but I'd like toreplace it with the appropriate comparison using an epsilon.
Am I correct in thinking that the epsilon should actually be chosen depending on the current calculation and the accuracy I am expecting from it?
I can see, for example, that the solve() method most of the times returns 0..0 but at times something like 6e-12 (which is absolutely sensible, given the imprecise nature of floating-pint types).
Would it be sensible to pass in an arbitrary epsilon to the equalsZero() function?
I have seen examples of usage of std::numerics<double>::epsilon but I am not sure how it should be used in my case...
Can you help me understand this stuff better?
Thanks!