[Kst] branches/work/kst/portto4/kst/src/libkstmath
Mike Fenton
mike at staikos.net
Tue Nov 4 17:38:24 CET 2008
SVN commit 880060 by fenton:
Fix double comparisons in equation node parsing.
M +12 -5 enodes.cpp
--- branches/work/kst/portto4/kst/src/libkstmath/enodes.cpp #880059:880060
@@ -37,6 +37,13 @@
#include "math_kst.h"
#include "objectstore.h"
+#define SMALL_NON_ZERO 0.00000000001
+#define DOUBLE_EQUAL(X,Y) ( (fabs( (X) - (Y) ) < SMALL_NON_ZERO) || X == Y ) /* X == Y */
+#define DOUBLE_LESSTHAN(X,Y) ( (Y) - (X) > SMALL_NON_ZERO ) /* X > Y */
+#define DOUBLE_LESSTHAN_EQUAL(X,Y) ( DOUBLE_LESSTHAN(X, Y) || DOUBLE_EQUAL(X, Y) ) /* X >= Y */
+#define DOUBLE_GREATERTHAN(X,Y) ( (X) - (Y) > SMALL_NON_ZERO ) /* Y > X */
+#define DOUBLE_GREATERTHAN_EQUAL(X,Y) ( DOUBLE_GREATERTHAN(X, Y) || DOUBLE_EQUAL(X, Y) ) /* X >= Y */
+
extern /*"C"*/ int yyparse(Kst::ObjectStore *store);
extern /*"C"*/ void *ParsedEquation;
extern /*"C"*/ struct yy_buffer_state *yy_scan_string(const char*);
@@ -1031,7 +1038,7 @@
double LessThan::value(Context *ctx) {
- return _left->value(ctx) < _right->value(ctx) ? EQ_TRUE : EQ_FALSE;
+ return DOUBLE_LESSTHAN(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE;
}
@@ -1061,7 +1068,7 @@
double LessThanEqual::value(Context *ctx) {
- return _left->value(ctx) <= _right->value(ctx) ? EQ_TRUE : EQ_FALSE;
+ return DOUBLE_LESSTHAN_EQUAL(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE;
}
@@ -1091,7 +1098,7 @@
double GreaterThan::value(Context *ctx) {
- return _left->value(ctx) > _right->value(ctx) ? EQ_TRUE : EQ_FALSE;
+ return DOUBLE_GREATERTHAN(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE;
}
@@ -1121,7 +1128,7 @@
double GreaterThanEqual::value(Context *ctx) {
- return _left->value(ctx) >= _right->value(ctx) ? EQ_TRUE : EQ_FALSE;
+ return DOUBLE_GREATERTHAN_EQUAL(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE;
}
@@ -1151,7 +1158,7 @@
double EqualTo::value(Context *ctx) {
- return _left->value(ctx) == _right->value(ctx) ? EQ_TRUE : EQ_FALSE;
+ return DOUBLE_EQUAL(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE;
}
More information about the Kst
mailing list