【发布时间】:2012-05-03 03:17:34
【问题描述】:
在我们拥有的一个 C++ 模块中,我们有一种表达式评估语言。
\
EVDataElement NAME::eval( const EvalContext &ec, \
const bool recursiveFlag, \
EVEvaluatorTraceFormatter * trace ) \
{ \
/* EVTimer timer("(DECLARE_REL_EVAL)","eval","*", "", 1,1, 3); */ \
EVDataElement val ( \
(left->eval(ec, recursiveFlag, trace)) \
OP (right->eval(ec, recursiveFlag, trace)) ); \
return val; \
}
DECLARE_REL_EVAL(oLT,<)
DECLARE_REL_EVAL(oLE,<=)
DECLARE_REL_EVAL(oGT,>)
DECLARE_REL_EVAL(oGE,>=)
DECLARE_REL_EVAL(oEQ,==)
DECLARE_REL_EVAL(oNE,!=)
该模块允许设置某些配置规则。
所以,如果数据库中有一条规则说 field1 - field2 > param1,它会通过传递给上面的表达式语言来验证这个条件并返回一个结果。
我们现在面临的问题是 param1 = 3, and field1 = 6.15, and field2 = 3.15
它说结果是真的。我认为这是因为 6.15 和 3.15 的差异导致 3.00
当 3.00 与 3 比较时,它认为 3.00 更大。有没有办法解决这个问题?
我说我们不能使用强制转换的原因是因为我们永远不知道左右可能会出现什么数据类型。我希望这个问题有意义。
【问题讨论】:
-
你怎么知道值是6.15?你确定它不是 6.150000000000001?
-
对于许多比较浮点数的情况,您至少应该找到绝对差异并进行比较以检查它是否小于适合您需要的一些小 epsilon(例如 1e-10)。
-
@MooingDuck:我不知道它是如何存储在内存中的,但是该值是从数据库中读取的,并且在数据库中存储的是 6.15。我试图找到从数据库中读取值的代码,但我认为它将它读取为双精度值。所以,即使在内存中,也应该是 6.150000
标签: c++ expression precision