[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